第14章Java网络编程ppt课件.ppt_第1页
第14章Java网络编程ppt课件.ppt_第2页
第14章Java网络编程ppt课件.ppt_第3页
第14章Java网络编程ppt课件.ppt_第4页
第14章Java网络编程ppt课件.ppt_第5页
已阅读5页,还剩39页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

第14章Java网络编程 14 1URL类 URL类是包中的一个重要的类 URL的实例封装着一个统一资源定位符 UniformResourceLocator 使用URL创建对象的应用程序称作客户端程序 一个URL对象封装着着一个具体的资源的引用 表明客户要访问这个URL中的资源 客户利用URL对象可以获取URL中的资源 一个URL对象通常包含最基本的三部分信息 协议 地址 资源 协议必须是URL对象所在的Java虚拟机支持的协议 许多协议并不为我们所常用 而常用的Http Ftp File协议都是虚拟机支持的协议 地址必须是能连接的有效IP地址或域名 资源可以是主机上的任何一个文件 14 1 1URL的构造方法 URL类通常使用如下的构造方法创建一个URL对象 publicURL Stringspec throwsMalformedURLException该构造方法使用字符串初始化一个URL对象 另一个常用的构造方法是 publicURL Stringprotocol Stringhost Stringfile throwsMalformedURLException该构造方法构造使用的协议 地址和资源分别由参数protocol host和file指定 14 1 2读取URL中的资源 URL对象调用InputStreamopenStream 方法可以返回一个输入流 该输入流指向URL对象所包含的资源 通过该输入流可以将服务器上的资源信息读入到客户端 URL对象调用InputStreamopenStream 方法可以返回一个输入流 该输入流指向URL对象所包含的资源 通过该输入流可以将服务器上的资源读入到客户端 14 2InetAdress类 14 2 1地址的表示Internet上的主机有两种方式表示地址 1 域名例如 2 IP地址例如 包中的InetAddress类对象含有一个Internet主机地址的域名和IP地址 14 2 2获取地址 1 获取Internet上主机的地址可以使用InetAddress类的静态方法 getByName Strings 将一个域名或IP地址传递给该方法的参数s 获得一个InetAddress对象 该对象含有主机地址的域名和IP地址 该对象用如下格式表示它包含的信息 另外 InetAddress类中还有两个实例方法 publicStringgetHostName 获取InetAddress对象所含的域名 publicStringgetHostAddress 获取InetAddress对象所含的IP地址 2 获取本地机的地址我们可以使用InetAddress类的静态方法 getLocalHost 获得一个InetAddress对象 该对象含有本地机的域名和IP地址 14 3套接字 14 3 1套接字网络通信使用IP地址标识Internet上的计算机 使用端口号标识服务器上的进程 程序 也就是说 如果服务器上的一个程序不占用一个端口号 用户程序就无法找到它 就无法和该程序交互信息 端口号被规定为一个16位的0 65535之间的整数 其中 0 1023被预先定义的服务通信占用 如telnet占用端口23 http占用端口80等 除非我们需要访问这些特定服务 否则 就应该使用1024 65535这些端口中的某一个进行通信 以免发生端口冲突当两个程序需要通信时 它们可以通过使用Socket类建立套接字对象并连接在一起 14 3 2客户端套接字 客户端的程序使用Socket类建立负责连接到服务器的套接字对象 Socket的构造方法是 Socket Stringhost intport 参数host是服务器的IP地址 port是一个端口号 建立套接字对象可能发生IOException异常 因此应象下面那样建立连接到服务器的套接字对象 try Socketmysocket newSocket 2010 catch IOExceptione 14 3 3ServerSocket对象与服务器端套接字 为了能使客户成功地连接到服务器 服务器必须建立一个ServerSocket对象 该对象通过将客户端的套接字对象和服务器端的一个套接字对象连接起来 从而达到连接的目的 ServerSocket的构造方法是 ServerSocket intport port是一个端口号 port必须和客户呼叫的端口号相同 当建立ServerSocket对象时可能发生IOException异常 因此应象下面那样建立ServerSocket对象 try ServerSocketserverForClient newServerSocket 2010 catch IOExceptione 当服务器的ServerSocket对象serverForClient建立后 就可以使用方法accept 将客户的套接字和服务器端的套接字连接起来 代码如下所示 try Socketsc serverForClient accept catch IOExceptione 连接建立后 服务器端的套接字对象调用getInetAddress 方法可以获取一个InetAddess对象 该对象含有客户端的IP地址和域名 同样 客户端的套接字对象调用getInetAddress 方法可以获取一个InetAddess对象 该对象含有服务器端的IP地址和域名 双方通信完毕后 套接字应使用close 方法关闭套接字连接 14 3 4使用多线程技术 从套接字连接中读取数据与从文件中读取数据有着很大的不同 尽管二者都是输入流 但从文件中读取数据时 所有的数据都已经在文件中了 而使用套接字连接时 可能在另一端数据发送出来之前 就已经开始试着读取了 这时 就会堵塞本线程 直到该读取方法成功读取到信息 本线程才继续执行后续的操作 因此 服务器端收到一个客户的套接字后 就应该启动一个专门为该客户服务的线程 可以使用Socket类的不带参数的构造方法Socket 创建一个套接字对象 该对象再调用publicvoidconnect SocketAddressendpoint throwsIOException请求和参数SocketAddress指定地址的服务器端的套接字建立连接 为了使用connect方法 可以使用SocketAddress的子类 InetSocketAddress创建一个对象 InetSocketAddress的构造方法是 publicInetSocketAddress InetAddressaddr intport 14 4UDP数据报 基于UDP的通信和基于TCP的通信不同 基于UDP的信息传递更快 但不提供可靠性保证 也就是说 数据在传输时 用户无法知道数据能否正确到达目的地主机 也不能确定数据到达目的地的顺序是否和发送的顺序相同 可以把UDP通信比作生活中的邮递信件 我们不能肯定所发的信件就一定能够到达目的地 也不能肯定到达的顺序是发出时的顺序 可能因为某种原因导致后发出的先到达 基于UDP通信的基本模式是 将数据打包 称为数据包 好比将信件装入信封一样 然后将数据包发往目的地 接受别人发来的数据包 好比接收信封一样 然后查看数据包中的内容 14 4 1发送数据包 1 用DatagramPacket类将数据打包 即用DatagramPacket类创建一个对象 称为数据包 用DatagramPacket的以下两个构造方法创建待发送的数据包 DatagramPacket bytedata intlength InetAddtressaddress intport 使用该构造方法创建的数据包对象具有下列两个性质 含有data数组指定的数据 该数据包将发送到地址是address 端口号是port的主机上 我们称address是它的目标地址 port是这个数据包的目标端口 DatagramPack bytedata intoffset intlength InetAddtressaddress intport 使用该构造方法创建的数据包对象含有数组data中从offset开始后的length个字节 该数据包将发送到地址是address 端口号是port的主机上 2 用DatagramSocket类的不带参数的构造方法 DatagramSocket 创建一个对象 该对象负责发送数据包 例如 DatagramSocketmail out newDatagramSocket mail out send data pack 14 4 2接收数据包 首先用DatagramSocket的另一个构造方法 DatagramSocket intport 创建一个对象 其中的参数必须和待接收的数据包的端口号相同 例如 如果发送方发送的数据包的端口是5666 那么如下创建DatagramSocket对象 DatagramSocketmail in newDatagramSocket 5666 然后对象mail in使用方法receive DatagramPacketpack 接受数据包 该方法有一个数据包参数pack 方法receive把收到的数据包传递给该参数 因此我们必须预备一个数据包以便收取数据包 这时需使用DatagramPack类的另外一个构造方法 DatagramPack bytedata intlength 创建一个数据包 用于接收数据包 例如 bytedata newbyte 100 intlength 90 DatagramPacketpack newDatagramPacket data length mail in receive pack 该数据包pack将接收长度是length字节的数据放入data 14 5广播数据报 计算机使用IP地址和端口来区分其位置和进程 但有一类地址非常特殊 称作D类地址 D类地址不是用来代表位置的 即在网络上不能使用D类地址去查找计算机 D类地址好像生活中的社团组织 不同地理位置的人可以加入相同的组织 继而可以享有组织内部的通信权利 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 0 224 255 255 255是保留地址 称作D类地址 要广播或接收广播的主机都必须加入到同一个D类地址 一个D类地址也称做一个组播地址 D类地址并不代表某个特定主机的位置 一个具有A B或C类地址的主机要广播数据或接收广播 都必须加入到同一个D类地址 14 6Java远程调用 RMI RMI RemoteMethodInvocation 是一种分布式技术 使用RMI可以让一个虚拟机上的应用程序请求调用位于网络上另一处的虚拟机上的对象方法 习惯上称发出调用请求的虚拟机为 本地 客户机 称接受并执行请求的虚拟机为 远程 服务器 14 6 1远程对象及其代理 1 远程对象驻留在 远程 服务器上的对象是客户要请求的对象 称作远程对象 即客户程序请求远程对象调用方法 然后远程对象调用方法并返回必要的结果 2 代理与存根 Stub RMI不希望客户应用程序直接与远程对象打交道 代替地让用户程序和远程对象的代理打交道 代理的特点是 它与远程对象实现了相同的接口 也就是说它与远程对象向用户公开了相同的方法 当用户请求代理调用这样的方法时 如果代理确认远程对象能调用相同的方法时 就把实际的方法调用委派给远程对象 RMI会帮助我们生成一个存根 Stub 一种特殊的字节码 并让这个存根产生的对象为作为远程对象的代理 代理需要驻留在客户端 也就是说 需要把RMI生成的存根 Stub 复制或下载到客户端 因此 在RMI中 用户实际上是在和远程对象的代理直接打交道 但用户并没有感觉到他在和一个代理打交道 而是觉得自己就是在和远程对象直接打交道 比如 用户想请求远程对象调用某个方法 只需将向远程代理发出同样的请求即可 3 Remote接口RMI为了标识一个对象是远程对象 即可以被客户请求的对象 要求远程对象必须实现java rmi包中的Remote接口 也就是说只有实现该接口的类的实例才被RMI认为是一个远程对象 Remote接口中没有方法 该接口仅仅起到一个标识作用 因此 必须扩展Remote接口 以便规定远程对象的那些方法是客户可以请求的方法 用户程序不必编写和远程代理的有关代码 只需知道远程代理和远程对象实现了相同的接口 14 6 2RMI的设计细节 为了叙述的方便 我们假设本地客户机存放有关类的目录是D Client 远程服务器的IP是127 0 0 1 存放有关类的目录是D Server 1 扩展Remote接口定义一个接口是java rmi包中Remote的子接口 即扩展Remote接口 以下是我们定义的Remote的子接口是RemoteSubject RemoteSubject子接口中定义了计算面积的方法 即要求远程对象为用户计算某种几何图形的面积 RemoteSubject的代码如下 RemoteSubject javaimportjava rmi publicinterfaceRemoteSubjectextendsRemote publicvoidsetHeight doubleheight throwsRemoteException publicvoidsetWidth doublewidth throwsRemoteException publicdoublegetArea throwsRemoteException 2 远程对象创建远程对象的类必须要实现Remote接口 RMI使用Remote接口来标识远程对象 但是Remote中没有方法 因此创建远程对象的类需要实现Remote接口的一个子接口 另外 RMI为了让一个对象成为远程对象还需要进行一些必要初始化工作 因此 在编写创建远程对象的类时 可以简单让该类是RMI提供的java rmi server包中的UnicastRemoteObject类的子类即可 以下是我们定义的创建远程对象的类 RemoteConcreteSubject 该类实现了上述RemoteSubject接口 见本节上述标题1中的RemoteSubject接口 所创建的远程对象可以计算矩形的面积 RemoteConcreteSubject的代码如下 RemoteConcreteSubject javaimportjava rmi importjava rmi server UnicastRemoteObject publicclassRemoteConcreteSubjectextendsUnicastRemoteObjectimplementsRemoteSubject doublewidth height publicRemoteConcreteSubject throwsRemoteException publicvoidsetWidth doublewidth throwsRemoteException this width width publicvoidsetHeight doubleheight throwsRemoteException this height height publicdoublegetArea throwsRemoteException returnwidth height 3 存根 Stub 与代理RMI负责产生存根 StubObject 如果创建远程对象的字节码是RemoteConcreteSubject class 那么存根 Stub 的字节码是RemoteConcreteSubject Stub class 即后缀为 Stub RMI使用rmic命令生成存根 RemoteConcreteSubject Stub class 首先进入D Server目录 然后如下执行rmic命令 rmicRemoteConcreteSubject执行过rmic命令将产生的存根 RemoteConcreteSubject Stub class 4 启动注册 rmiregistry在远程服务器创建远程对象之前 RMI要求远程服务器必须首先启动注册 rmiregistry 只有启动了rmiregistry 远程服务器才可以创建远程对象 并将该对象注册到rmiregistry所管理的注册表中 在远程服务器开启一个终端 比如在MS DOS命令行窗口进入D Server目录 然后执行rimregistry命令 图14 14启动注册rmiregistry启动注册 也可以后台启动注册 startrmiregistry 5 启动远程对象服务远程服务器启动注册rmiregistry后 远程服务器就可以启动远程对象服务了 即编写程序来创建和注册远程对象 并运行该程序 远程服务器使用java

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论