第14Java网络编程

上传人:re****.1 文档编号:587208658 上传时间:2024-09-05 格式:PPT 页数:43 大小:1.02MB
返回 下载 相关 举报
第14Java网络编程_第1页
第1页 / 共43页
第14Java网络编程_第2页
第2页 / 共43页
第14Java网络编程_第3页
第3页 / 共43页
第14Java网络编程_第4页
第4页 / 共43页
第14Java网络编程_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《第14Java网络编程》由会员分享,可在线阅读,更多相关《第14Java网络编程(43页珍藏版)》请在金锄头文库上搜索。

1、第14章 Java网络编程 夷仑握弯磊汽链辫济扎峰忽障头帚质剐宣货速狮摇剪椰副侥履水丛苫严吴第14Java网络编程第14Java网络编程14.1 URL14.1 URL类类 URL类是包中的一个重要的类,URL的实例封装着一个统一资源定位符(Uniform Resource Locator),使用URL创建对象的应用程序称作客户端程序。一个URL对象封装着着一个具体的资源的引用,表明客户要访问这个URL中的资源,客户利用URL对象可以获取URL中的资源。一个URL对象通常包含最基本的三部分信息:协议、地址、资源。协议必须是URL对象所在的Java虚拟机支持的协议,许多协议并不为我们所常用,而常

2、用的Http、Ftp、File协议都是虚拟机支持的协议;地址必须是能连接的有效IP地址或域名;资源可以是主机上的任何一个文件 瑟跳咖蒙示猾腋铅哨彪矩最嗅彦谷伟急敬而彤索坍匙或肿傻蔓渐答粹圭犯第14Java网络编程第14Java网络编程14.1.1 URL14.1.1 URL的构造方法的构造方法 URL类通常使用如下的构造方法创建一个URL对象:public URL(String spec) throws MalformedURLException该构造方法使用字符串初始化一个URL对象 努相优鱼芋呈羽隙奎线险嗣丫晨肖扎吞赛馅子所截音泛掺几盅谬廊阎恢语第14Java网络编程第14Java网络编程

3、另一个常用的构造方法是:public URL(String protocol, String host,String file) throws MalformedURLException该构造方法构造使用的协议、地址和资源分别由参数protocol、host和file指定 之倘轨陵壮纂斧您殿壶瓦椎棕颇锨滑残射疯昂卵归泡尉泽撂见醇段鳞亥渍第14Java网络编程第14Java网络编程14.1.2 14.1.2 读取读取URLURL中的资源中的资源 URL对象调用InputStream openStream() 方法可以返回一个输入流,该输入流指向URL对象所包含的资源。通过该输入流可以将服务器上的

4、资源信息读入到客户端。URL对象调用InputStream openStream() 方法可以返回一个输入流,该输入流指向URL对象所包含的资源。通过该输入流可以将服务器上的资源读入到客户端 振香藐闻旋碌来肆逊脉组些览赔狡捌霓厌咬鞋触世敏饮烯巍签泉测集恭睬第14Java网络编程第14Java网络编程14.2 InetAdress14.2 InetAdress类类 14.2.1 地址的表示 Internet上的主机有两种方式表示地址:1域名例如,2IP 地址例如,包中的InetAddress类对象含有一个Internet主机地址的域名和IP地址: 支髓尽藐览轩锻妊伦苑伞猩叉砂梧婴锥救帆请驱歉贿兆

5、畴宿俄消汗誊究辩第14Java网络编程第14Java网络编程14.2.2 14.2.2 获取地址获取地址 1获取Internet上主机的地址可以使用InetAddress类的静态方法:getByName(String s);将一个域名或IP地址传递给该方法的参数s,获得一个InetAddress对象,该对象含有主机地址的域名和IP地址,该对象用如下格式表示它包含的信息: 麻主床剂撰奢乐蹬膝雏椎野缕而傈篮逐醒挞迈铝师懂裴纯芽害蔚躁落捌闸第14Java网络编程第14Java网络编程另外,InetAddress类中还有两个实例方法:public String getHostName() 获取Inet

6、Address对象所含的域名。public String getHostAddress() 获取InetAddress对象所含的IP地址。棠酥污书潜密祈捉淹楔旦磅匙萨歧缨哭眷曼招搔通骗施犀以球于娟貌扮革第14Java网络编程第14Java网络编程2获取本地机的地址我们可以使用InetAddress类的静态方法:getLocalHost()获得一个InetAddress对象,该对象含有本地机的域名和IP地址。 簧辊鲁因平哩均靳砸凳永糜乡玲面悯氧檄娱韶湖缀领喝猎何乳蛀肘淬伪宽第14Java网络编程第14Java网络编程14.3 14.3 套接字套接字 14.3.1 套接字 网络通信使用IP地址标识

7、Internet上的计算机,使用端口号标识服务器上的进程(程序)。也就是说,如果服务器上的一个程序不占用一个端口号,用户程序就无法找到它,就无法和该程序交互信息。端口号被规定为一个16位的065535之间的整数,其中,01023被预先定义的服务通信占用(如telnet占用端口23,http占用端口80等),除非我们需要访问这些特定服务,否则,就应该使用102465535这些端口中的某一个进行通信,以免发生端口冲突 当两个程序需要通信时,它们可以通过使用Socket类建立套接字对象并连接在一起 杏顾冻伯釉扼讲袋芒锅垄花疹烦树雪缺悯旗焊铆千迁乳钱告仗诫汞睦榜名第14Java网络编程第14Java网

8、络编程14.3.2 14.3.2 客户端套接字客户端套接字 客户端的程序使用Socket类建立负责连接到服务器的套接字对象。Socket的构造方法是:Socket(String host,int port),参数host是服务器的IP地址,port是一个端口号。建立套接字对象可能发生IOException异常,因此应象下面那样建立连接到服务器的套接字对象:try Socket mysocket=new Socket(http:/192.168.0.78,2010);catch(IOException e)泰喊檀泪牺晾恋抿溉切霜懂砚扇槛馆邵拘兴才陀佐薄荆瘦蒂糊黑宅健讫匡第14Java网络编程第1

9、4Java网络编程14.3.3 ServerSocket14.3.3 ServerSocket对象与服务器端对象与服务器端套接字套接字 为了能使客户成功地连接到服务器,服务器必须建立一个ServerSocket对象,该对象通过将客户端的套接字对象和服务器端的一个套接字对象连接起来,从而达到连接的目的。ServerSocket的构造方法是:ServerSocket(int port),port是一个端口号。port必须和客户呼叫的端口号相同。当建立ServerSocket对象时可能发生IOException异常,因此应象下面那样建立ServerSocket对象:try ServerSocket

10、serverForClient = new ServerSocket(2010);catch(IOException e)坞遂尹茶酱委创达桔无宪哭剧漆处需懂贩贾夺悄亥釜缅跋锁镐杯坤莲滥杉第14Java网络编程第14Java网络编程当服务器的ServerSocket对象serverForClient建立后,就可以使用方法accept()将客户的套接字和服务器端的套接字连接起来,代码如下所示:try Socket sc = serverForClient.accept();catch(IOException e)竣作斌盆搂睬靠凉吼塑眶攀触压单淮望食匆爽主炉受通潜艺恕孕谜尹补缮第14Java网络编程

11、第14Java网络编程客户端的Socket输入流输出流服务器端Socket输出流输入流图14.2 套接字连接示意图互相连接互相连接像嗜矢垫对侍琅贤兼竖峰逆卑淘输测护倦挚懒爆喇剿畅掀示轻恭进啃馁成第14Java网络编程第14Java网络编程连接建立后,服务器端的套接字对象调用getInetAddress()方法可以获取一个InetAddess对象,该对象含有客户端的IP地址和域名,同样,客户端的套接字对象调用getInetAddress()方法可以获取一个InetAddess对象,该对象含有服务器端的IP地址和域名。 双方通信完毕后,套接字应使用close()方法关闭套接字连接 命赌炳狞娇驭济镭

12、耻胃辫促霞粒征猩秉事烩碴逾赘伪忘碾吏扬夸抑清莆鼻第14Java网络编程第14Java网络编程14.3.4 14.3.4 使用多线程技术使用多线程技术 从套接字连接中读取数据与从文件中读取数据有着很大的不同。尽管二者都是输入流,但从文件中读取数据时,所有的数据都已经在文件中了,而使用套接字连接时,可能在另一端数据发送出来之前,就已经开始试着读取了,这时,就会堵塞本线程,直到该读取方法成功读取到信息,本线程才继续执行后续的操作。因此,服务器端收到一个客户的套接字后,就应该启动一个专门为该客户服务的线程 南傲衰寄掐玖勿眼铺寞螟谴曲娩蠢骨首魏镀煌盲拣陇眨帖珐罪灾宇午谱悍第14Java网络编程第14Ja

13、va网络编程服务器程序客户1的线程客户1客户2的线程客户2客户3的线程客户3图14.5 具有多线程的服务器端程序晰顺匙庐筏侍如驼巴庄董陵什纠视增熄骋炬债茫赠杆寨吵桐仟驰聂鹏脯棉第14Java网络编程第14Java网络编程可以使用Socket类的不带参数的构造方法Socket()创建一个套接字对象,该对象再调用 public void connect(SocketAddress endpoint) throws IOException请求和参数SocketAddress指定地址的服务器端的套接字建立连接。为了使用connect方法,可以使用SocketAddress的子类:InetSocketA

14、ddress创建一个对象,InetSocketAddress的构造方法是: public InetSocketAddress(InetAddress addr, int port)寸擞蚀腹硼尸刮频沟固巷坚八疤弗彰鸥盐吻皿资奇龙浚骄数婴一馈糯告参第14Java网络编程第14Java网络编程14.4 UDP14.4 UDP数据报数据报 基于UDP的通信和基于TCP的通信不同,基于UDP的信息传递更快,但不提供可靠性保证。也就是说,数据在传输时,用户无法知道数据能否正确到达目的地主机,也不能确定数据到达目的地的顺序是否和发送的顺序相同。可以把UDP通信比作生活中的邮递信件,我们不能肯定所发的信件就一

15、定能够到达目的地,也不能肯定到达的顺序是发出时的顺序,可能因为某种原因导致后发出的先到达。 越驱狮嘛兔驴鹤亥颤吊窥孟吭茶液斯括循厩靖翌貉且帮蜗抖券锄歇谦扁炙第14Java网络编程第14Java网络编程基于UDP通信的基本模式是:将数据打包,称为数据包(好比将信件装入信封一样),然后将数据包发往目的地。接受别人发来的数据包(好比接收信封一样),然后查看数据包中的内容。舜猿维宿若敝她择诺澳词使罪脊泄赴异忻软驰邢射囱侯锋旗俗礁戚敷猩牙第14Java网络编程第14Java网络编程14.4.1 14.4.1 发送数据包发送数据包 1用DatagramPacket类将数据打包,即用DatagramPack

16、et类创建一个对象,称为数据包。用DatagramPacket的以下两个构造方法创建待发送的数据包: DatagramPacket(byte data,int length,InetAddtress address,int port):黍条对瑰的芹续滴认敞巳没轮悬却涯始哺忻受灭式奏鳞匿航捐筛咳霖凸带第14Java网络编程第14Java网络编程使用该构造方法创建的数据包对象具有下列两个性质:含有data数组指定的数据。该数据包将发送到地址是address、端口号是port的主机上。我们称address是它的目标地址、port是这个数据包的目标端口。DatagramPack(byte data,i

17、nt offset,int length,InetAddtress address,int port)使用该构造方法创建的数据包对象含有数组data中从offset开始后的length个字节,该数据包将发送到地址是address,端口号是port的主机上。 拼盅音斯咽丘筒昏挡迈盅棒身夷炸佣玩碗枉污炳闽冯拇掂略写证法姚凹界第14Java网络编程第14Java网络编程2用DatagramSocket类的不带参数的构造方法:DatagramSocket()创建一个对象,该对象负责发送数据包。例如:DatagramSocket mail_out=new DatagramSocket();mail_ou

18、t.send(data_pack);怕础料按琉饮鲍恬歼构攘烈毋绒贬孺叔撅讼诬矢代健拽竣温抱党载瑰用剁第14Java网络编程第14Java网络编程14.4.2 14.4.2 接收数据包接收数据包 首先用DatagramSocket的另一个构造方法:DatagramSocket(int port) 创建一个对象,其中的参数必须和待接收的数据包的端口号相同。例如,如果发送方发送的数据包的端口是5666,那么如下创建DatagramSocket对象:DatagramSocket mail_in=new DatagramSocket(5666); 宫唤万俄于让雇疯逃唬崭速前冤亥渭趁潭题夹样率妈炙捞傲抄玄

19、玲套蜘岂第14Java网络编程第14Java网络编程然后对象mail_in使用方法receive(DatagramPacket pack)接受数据包。该方法有一个数据包参数pack,方法receive把收到的数据包传递给该参数。因此我们必须预备一个数据包以便收取数据包。这时需使用 DatagramPack类的另外一个构造方法:DatagramPack(byte data,int length)创建一个数据包,用于接收数据包,例如:byte data=new byte100;int length=90;DatagramPacket pack=new DatagramPacket(data,len

20、gth);mail_in.receive(pack);该数据包pack将接收长度是length字节的数据放入data。 揖或晰雹搁贰细碉柑熟鼻跟其希租盆抠钳陋颂俐纯侦繁膨啃犁阉蠢激盯蔽第14Java网络编程第14Java网络编程14.5 14.5 广播数据报广播数据报 计算机使用IP地址和端口来区分其位置和进程,但有一类地址非常特殊,称作D类地址,D类地址不是用来代表位置的,即在网络上不能使用D类地址去查找计算机。 D类地址好像生活中的社团组织,不同地理位置的人可以加入相同的组织,继而可以享有组织内部的通信权利。 干瘸她精未浚霍扮内矛兢杰维杯陷计州逞服恼暮痛眷兜皆脑碰幢除猎斩棘第14Java网

21、络编程第14Java网络编程Internet的地址是a.b.c.d的形式。该地址的一部分代表用户自己的主机,而另一部分代表用户所在的网络。当a小于128,那么b.c.d就用来表示主机,这类地址称做A类地址。如果a大于等于128并且小于192,则a.b表示网络地址,而c.d表示主机地址,这类地址称做B类地址。如果a大于等于192,则网络地址是a.b.c,d表示主机地址,这类地址称做C类地址。224.0.0.0224.255.255.255是保留地址,称作D类地址 渣草衔蒲戴醛辑蝴诸戏佃姚镊链弃群众计鸵榴住鳞护饮烫谦哩桩逮打甭织第14Java网络编程第14Java网络编程要广播或接收广播的主机都必

22、须加入到同一个D类地址。一个D类地址也称做一个组播地址,D类地址并不代表某个特定主机的位置,一个具有A、B或C类地址的主机要广播数据或接收广播,都必须加入到同一个D类地址。 涣碘序干岿含几蜗蓖锚拘洋劝荤勒雄被贱员雕拱涛序羊观炎荫嘘墓厕峭邦第14Java网络编程第14Java网络编程14.6 Java 14.6 Java 远程调用(远程调用(RMIRMI) RMI(Remote Method Invocation)是一种分布式技术,使用RMI可以让一个虚拟机上的应用程序请求调用位于网络上另一处的虚拟机上的对象方法。习惯上称发出调用请求的虚拟机为(本地)客户机,称接受并执行请求的虚拟机为(远程)服

23、务器 帝长枕球杰也下茶角碾投尾糜凛次洪遏匠想涨丙垢摆桩妇奖值出郁破均勿第14Java网络编程第14Java网络编程14.6.1 14.6.1 远程对象及其代理远程对象及其代理 1远程对象驻留在(远程)服务器上的对象是客户要请求的对象,称作远程对象,即客户程序请求远程对象调用方法,然后远程对象调用方法并返回必要的结果。 鲸滨榜钟芦侮淄夫沤岭丢轩鲜剪乖暴钙喻签盗诫甜戮彰提咬柠烁憨粗浓击第14Java网络编程第14Java网络编程2代理与存根(Stub)RMI不希望客户应用程序直接与远程对象打交道,代替地让用户程序和远程对象的代理打交道。代理的特点是:它与远程对象实现了相同的接口,也就是说它与远程对

24、象向用户公开了相同的方法,当用户请求代理调用这样的方法时,如果代理确认远程对象能调用相同的方法时,就把实际的方法调用委派给远程对象。 策谱群皇订撩傈挛您吩它欠誊饰子泄瞄想土紊咳郧目壹熔沧隅躬忱尹褥沦第14Java网络编程第14Java网络编程RMI会帮助我们生成一个存根(Stub):一种特殊的字节码,并让这个存根产生的对象为作为远程对象的代理。代理需要驻留在客户端,也就是说,需要把RMI生成的存根(Stub)复制或下载到客户端。因此,在RMI中,用户实际上是在和远程对象的代理直接打交道,但用户并没有感觉到他在和一个代理打交道,而是觉得自己就是在和远程对象直接打交道。比如,用户想请求远程对象调用

25、某个方法,只需将向远程代理发出同样的请求即可 翰役粪童疯逗舶膛厦颐亩剧培唐藐胸纸道炼躇遇楷躯宾任犯炸偿鞋逞掷饲第14Java网络编程第14Java网络编程(本地)客户机远程代理客户应用程序请求(远程)服务器远程对象请求响应图14.12 远程代理与远程对象响应照肩迸赵击秘迅蹲伸晓侵鼠釜目底籽过钉驶佣泡症切刚盅野漆涯陨砒亿棱第14Java网络编程第14Java网络编程3Remote接口RMI为了标识一个对象是远程对象,即可以被客户请求的对象,要求远程对象必须实现java.rmi包中的Remote接口,也就是说只有实现该接口的类的实例才被RMI认为是一个远程对象。Remote接口中没有方法,该接口仅

26、仅起到一个标识作用,因此,必须扩展Remote接口,以便规定远程对象的那些方法是客户可以请求的方法,用户程序不必编写和远程代理的有关代码,只需知道远程代理和远程对象实现了相同的接口 怔抉超悦栽蛮禽汇欲拒添籽峨档旺绝购草盗灭茄骸刽瞎碉宾宏赚诸袒走甥第14Java网络编程第14Java网络编程14.6.2 RMI14.6.2 RMI的设计细节的设计细节 为了叙述的方便,我们假设本地客户机存放有关类的目录是D:Client;远程服务器的IP是127.0.0.1,存放有关类的目录是D:Server。 芬汤戚圃眯辈泣脊绑蝉蕴侍葫司纱殷蛹秀匪诵合凌挽讫氖韩慑插曳槽止院第14Java网络编程第14Java网

27、络编程1扩展Remote接口定义一个接口是java.rmi包中Remote的子接口,即扩展Remote接口。以下是我们定义的Remote的子接口是RemoteSubject。RemoteSubject子接口中定义了计算面积的方法,即要求远程对象为用户计算某种几何图形的面积。RemoteSubject的代码如下:RemoteSubject.java RemoteSubject.java import java.rmi.*;public interface RemoteSubject extends Remote public void setHeight(double height) throw

28、s RemoteException; public void setWidth(double width) throws RemoteException; public double getArea() throws RemoteException;砂己囤仓氛扇滨烫酷谐真拱供样咖拧前粗募阳锯乍耻铁馁够裸锦援抱维番第14Java网络编程第14Java网络编程2远程对象创建远程对象的类必须要实现Remote接口,RMI使用Remote接口来标识远程对象,但是Remote中没有方法,因此创建远程对象的类需要实现Remote接口的一个子接口。另外,RMI为了让一个对象成为远程对象还需要进行一些必要初始

29、化工作,因此,在编写创建远程对象的类时,可以简单让该类是RMI提供的java.rmi.server包中的UnicastRemoteObject类的子类即可。 败羊席蜘吟蟹斜迟眶岭泄企训事鸿锤撵菜酗睹莎酪营虫彩鼠伺昏雏闭觅雪第14Java网络编程第14Java网络编程以下是我们定义的创建远程对象的类:RemoteConcreteSubject,该类实现了上述RemoteSubject接口(见本节上述标题1中的RemoteSubject接口),所创建的远程对象可以计算矩形的面积,RemoteConcreteSubject的代码如下:RemoteConcreteSubject.java Remote

30、ConcreteSubject.java import java.rmi.*;import java.rmi.server.UnicastRemoteObject;public class RemoteConcreteSubject extends UnicastRemoteObject implements RemoteSubject double width,height; public RemoteConcreteSubject() throws RemoteException public void setWidth(double width) throws RemoteExcepti

31、on this.width=width; public void setHeight(double height) throws RemoteException this.height=height; public double getArea() throws RemoteException return width*height; 凶獭窜险苔颠癣揍调豁撤怒募攫馅婴伎徒卡仁色遁管鸳志乐迹罢弊妙胡为第14Java网络编程第14Java网络编程3. 存根(Stub)与代理RMI负责产生存根(Stub Object),如果创建远程对象的字节码是RemoteConcreteSubject.class

32、,那么存根(Stub)的字节码是RemoteConcreteSubject_Stub.class,即后缀为“_Stub”。RMI使用rmic命令生成存根:RemoteConcreteSubject_Stub.class。首先进入D:Server目录,然后如下执行rmic命令:rmic RemoteConcreteSubject执行过rmic命令将产生的存根:RemoteConcreteSubject_Stub.class 东狙秽溅捡饵蝉芋考椅肪突桨混请垛睛颅黄霞致核遥矛僳咙郴择咖番烙醚第14Java网络编程第14Java网络编程4.启动注册:rmiregistry在远程服务器创建远程对象之前,

33、RMI要求远程服务器必须首先启动注册:rmiregistry,只有启动了rmiregistry,远程服务器才可以创建远程对象,并将该对象注册到rmiregistry所管理的注册表中。在远程服务器开启一个终端,比如在MS-DOS命令行窗口进入D:Server目录,然后执行rimregistry命令:图14.14 启动注册rmiregistry启动注册,也可以后台启动注册:start rmiregistry 送伞凌赛淖娘被澜睡代匠颧囤未高由溢纹牢索巴孪唯些审粮烙段艺翌捌勿第14Java网络编程第14Java网络编程5.启动远程对象服务远程服务器启动注册rmiregistry后,远程服务器就可以启动

34、远程对象服务了,即编写程序来创建和注册远程对象,并运行该程序。远程服务器使用java.rmi包中的Naming类调用其类方法:rebind(String name, Remote obj)绑定一个远程对象到rmiregistry所管理的注册表中,该方法的name参数是URL格式,obj参数是远程对象,将来客户端的代理会通过name 找到远程对象obj。 栓旨模猿鲁阵同户羞评篙袄羌硼闰咱腾嗅囱芹锥隙羌湾弘傲讶丧驰潭忙秦第14Java网络编程第14Java网络编程BindRemoteObject.java BindRemoteObject.java import java.rmi.*;public

35、 class BindRemoteObject public static void main(String args) try RemoteConcreteSubject remoteObject=new RemoteConcreteSubject(); Naming.rebind(rmi:/127.0.0.1/rect,remoteObject); System.out.println(be ready for client server.); catch(Exception exp) System.out.println(exp); 痪董稼占厨君谊徒彭秋艺霞族认新调蚀占促赁彦乎曹芳忧蔬苗

36、湾朋涤咨缅第14Java网络编程第14Java网络编程运行客户端程序远程服务器启动远程对象服务后,客户端就可以运行有关程序,访问使用远程对象。客户端使用java.rmi包中的Naming类调用其类方法:lookup(String name)返回一个远程对象的代理,即使用存根(Stub)产生一个和远程对象具有同样接口的对象。Lookup(String name)方法中的name参数的取值必须是远程对象注册的name,比如:rmi:/127.0.0.1/rect。 客户程序可以像使用远程对象一样来使用lookup(String name)方法返回的远程代理。比如,下面的客户应用程序ClientApplication中的Naming.lookup(rmi:/127.0.0.1/rect);返回一个实现了RemoteSubject接口的远程代理 鲜捷阉幅盔赚惑沽凭扰宋瘤麓胃卖逝乖篡荚率瑰辉乌凛伸轴血苯灼遁锁孟第14Java网络编程第14Java网络编程

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 资格认证/考试 > 自考

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号