第5章net包熟练使用InetAddress类构造IP地址对象;理解Java网络中的统一资源定位符的概念及使用方法;熟练掌握套接字的应用;能够理解基于UDP协议的通信方式,并熟练应用。两台计算机通过网络进行通信AB网络192.168.1.23192.168.1.10协议协议端口端口5.1网络基础端口号是用一个16位的二进制整数来表达的,其范围为0~65535,其中0~1023为系统所保留,专门给那些通用的服务(well-knownservices),如http服务的端口号为80,telnet服务的端口号为23,ftp服务的端口为21,…因此,当我们编写通信程序时,应选择一个大于1023的数作为端口号,以免发生冲突。5.2Java的网络功能Java提供的网络功能有三大类:URL,Socket,DatagramSocket:URL是三大功能中最高级的一种,通过它Java程序可以直接送出或读入网络上的数据;Socket使用的是TCP(TransmissionControlProtocol)协议,这是传统网络程序最常用的方式,可以想象为两个不同的程序通过网络的通信信道进行通信,安全可靠;DatagramSocket使用的是UDP(UserDatagramProtocol)协议,是更低级的网络传输方式,它把数据的目的地纪录在数据包中,然后直接放在网络上,效率高、不可靠;5.3InetAddress类此类表示互联网协议(IP)地址;它没有public的构造方法,而是通过几个静态的构造方法返回本类型的对象;常用的有:publicstaticInetAddressgetByName(Stringhost)throwsUnknownHostExceptionpublicstaticInetAddress[]getAllByName(Stringhost)throwsUnknownHostExceptionpublicstaticInetAddressgetLocalHost()throwsUnknownHostException例:InetAddresslocalHostAddress=InetAddress.getByName(“xxx);5.4URL类URL是统一资源定位符(UniformResourceLocator)的简称,它表示Internet上某一资源的地址。Internet上的资源包括图象文件、声音文件、动画文件等;通过URL,就可以访问Internet。浏览器或其他程序通过解析给定的URL就可以在网络上查找相应的文件或其他资源。Java中的URL类是指向互联网“资源”的指针。资源可以是简单的文件或目录,也可以是对更为复杂的对象的引用;一个完整的URL由五部分组成:协议名、主机的域名(IP)、端口号、资源地址(文件路径和文件名)、引用,如:;协议于主机名之间用://隔开,主机名与端口号之间用:隔开,资源地址与引用之间用#隔开;一个合法URL并不需要将以上信息全部包括,可以省略一些信息,如:通过URL读取网络信息importjava.net.*;importjava.io.*;publicclassURLReader{publicstaticvoidmain(Stringargs[]){try{URLgis=newURL();BufferedReaderin=newBufferedReader(newInputStreamReader(gis.openStream()));Stringline;while((line=in.readLine())!=null){System.out.println(line);}in.close();}catch(Exceptione){System.out.println(e);}}}5.6套接字的概念套接字(Socket)是网络上运行的程序之间双向通信链路的端点,一个程序将一段信息写入Socket中,该Socket将这段信息发送给另外一个Socket,这段信息能够传送到其他程序中。IP与端口的组合得出一个套接字,可以完全分辨internet上运行的程序网络服务IP,porthttpftp其他21telnet数据结构I/O缓冲区端口8023客户程序SocketSocket5.7流套接字流套接字是两个网络应用程序之间发送和接收信息的连接;流套接字依靠TCP协议来保证信息正确到达目的地;实际上,信息有可能在网络中丢失或者在传送过程中发生错误,任何一种情况发生,作为接受方的TCP将联系发送方TCP重新发送这个信息;这就是所谓的在两个流套接字之间建立可靠的连接。创建服务器(端口号)定义数据成员服务器等待网络连接建立socket流读客户端信息向用户发送字符串创建Socket实例定义数据成员建立socket流读socket流(看到提示)送信息给服务器关闭流waitingforuser5678connetctingclient...关闭流基于TCP的socket编程ServerServerServerSocket(intport)Socketaccept()OutputStreamSocket.getOutputStream()InputStreamSocket.getInputSream()Socket.close()ClientSocket(InetAddressaddress,intport)OutputStreamSocket.getOutputStream()InputStreamSocket.getInputStream()Socket.close()服务器程序编写:①调用ServerSocket(intport)创建一个服务器端套接字,并绑定到指定端口上;②调用accept(),监听连接请求,如果客户端请求连接,则接受连接,返回通信套接字。③调用Socket类的getOutputStream()和getInputStream获取输出流和输入流,开始网络数据的发送和接收。④最后关闭通信套接字。客户端程序编写:①调用Socket()创建一个流套接字,并连接到服务器端;②调用Socket类的getOutputStream()和getInputStream获取输出流和输入流,开始网络数据的发送和接收。③最后关闭通信套接字。5.8自寻址套接字自寻址套接字(也叫数据报通信)使用UDP发送寻址信息;与TCP保证信息到达信息目的地的方式不同,UDP提供了另外一种方法,如果自寻址信息包没有到达目的地,那么UDP也不会请求发送者重新发送自寻址包;因此,这种方式不可靠,通常用在在线视频等,对数据准确性要求不是很高的场合。建立数据报socket(8189)建立一个报文包packet等待请求报文建立数据报socket建立一个请求包(接收端IP、端口)发出请求获得对方地址构成信息包发送出去创建接收包等待接收基于UDP的socket编程接收端(Server)发送端(Client)DatagramSocket(intport)DatagramSocket()DatagramPacket(byte[]buf,intlength)DatagramSocket.receive(DatagramPacketp)DatagramSocket.close()DatagramSocket.close()DatagramPacket(byte[]buf,intlength,InetAddressaddress,intport)DatagramSocket.send(DatagramPacketp)接收端程序编写:①调用DatagramSocket(intport)创建一个数据报套接字,并绑定到指定端口上;②调用DatagramPacket(byte[]buf,intlength),建立一个字节数组以接收UDP包。③调用DatagramSocket类的receive(),接收UDP包。④最后关闭数据报套接字。发送端程序编写:①调用DatagramSocket()创建一个数据报套接字;②调用DatagramPacket(byte[]buf,intoffset,intlength,InetAddressaddress,intport),建立要发送的UDP包。③调用DatagramSocket类的send(),发送UDP包。④最后关闭数据报套接字。