【精品】Java实用教程第21讲网络编程精品ppt课件.ppt
Java实用教程第21讲网络编程互联上计算机之间的通信必须遵循一定的协议,目前最广泛的网络协议是TCP/IP协议,IP协议主要负责网络主机的定位,实现数据传输的路由选择。实际应用中使用域名地址,域名和IP之间的转换通过域名解析完成。网络传输层负责数据传输时的正确性,该层有两类典型的通信协议:TCP协议和UDP协议。(1)TCP:Transfer Control Protocol通过TCP协议传输,得到的是一个顺序的无差错的数据流使用TCP通信,发送方和接收方首先要建立socket连接,在客户/服务器通信中,服务方在某个端口提供服务,等待客户方的访问连接,建立连接后,双方就可以发送和接收数据了。(2)UDP:User Datagram ProtocolUDP是一种无连接的协议,每个数据报都是一个独立的信息,包括完整的源地址或目的地址,它在网络上以任何可能的路径传往目的地。因此能否到达目的地、到达目的地的时间及内容的正确性都不能保证,但UDP无需进行连接,传输效率高。如传输声音信号或视频信号等。包中提供了丰富的网络功能:(1)InetAddress类表示IP地址;(2)URL类封装了对资源的访问;(3)ServerSocket类和Socket类实现面向连接的网络通信;(4)DatagramPacket类和DatagrameSocket类实现数据报的收发21.1 InetAddress21.1 InetAddress类类因特网上用IP地址或域名标识主机,InetAddress对象封装了这两部分内容。InetAddress对象使用如下格式表示主机的信息: InetAddress getByName(String host):根据主机名InetAddress对象,使用该方法必须捕获UnknownHostException异常。String getFile():获取URL的文件名,它是带路径的文件标识;String getHost():获取URL的主机名;String getPath():取得URL的路径部分;int getPort():取得URL的端口号;URLConnection openConnection():返回代表与URL进行连接的URLConnection对象;InputStream openStream():打开与URL的连接,返回来自连接的输入流;Object getContent():获取URL的内容。21.3 URLConnection21.3 URLConnection类类URLConnection类可实现与URL资源双向通信。它代表应用程序和 URL 之间的通信链接。此类的实例可用于读取和写入此URL引用的资源。通常,创建一个到URL的连接需要几个步骤:(1)通过在URL上调用openConnection方法创建连接对象。(2)处理设置参数和一般请求属性。(3)使用connect方法建立到远程对象的实际连接,或者使用URL类的openConnection()方法建立实际连接。(4)远程对象变为可用。远程对象的头字段和内容变为可访问。21.4 Socket21.4 Socket通信通信Java提供了Socket类和ServerSocket类分别用于Client端和Server端的Socket通信,下面是分别对这两个类进行介绍。(1)Socket类构造方法:Socket(String,int):构造一个指定主机,指定端口号的Socket。Socket(InetAddress,int):构造一个指定Internet地址,指定端口号的Socket。(2)ServerSocket类 ServerSocket(int):创建绑定到特定端口的服务器套接字。ServerSocket(int,int):创建服务器套接字并将其绑定到指定的本地端口号,其中第二个参数是监听时间的长度。(3)建立连接与数据通信 首先,在服务器端创建一个ServerSocket对象,此对象通过执行accept()方法监听客户端连接,此时服务器端线程处于等待状态。然后在客户端构造Socket,与某服务器的指定端口进行连接。服务器监听到连接请求后,就可在两者之间建立连接,连接建立后,就可以取得相应的输入、输出流进行通信。在典型的服务器中,我们希望同时能处理多个客户的请求。解决这个问题的关键就是多线程处理机制。最基本的方法是在服务器(程序)里创建单个ServerSocket,并调用accept()来等候一个新连接。一旦accept()返回,我们就取得结果获得的Socket,并用它新建一个线程,令其只为那个特定的客户服务。然后再调用accept(),等候下一次新的连接请求。21.5 21.5 无连接的数据报无连接的数据报数据报是一种无连接的通信方式,它的速度比较快,但是由于不建立连接,不能保证所有数据都能送到目的地,一般用于传送非关键性的数据。(1)DatagramPacket类此类是进行数据通信的基本单位,包含需要传送的数据、数据报的长度、IP地址和端口号等信息。其构造方法如下:DatagramPacket(bytebuf,intlength):构造 DatagramPacket,用来接收长度为 length 的数据包。DatagramPacket(bytebuf,intlength,InetAddressaddress,intport):构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。DatagramPacket(bytebuf,intoffset,intlength):构造 DatagramPacket,用来接收长度为 length 的包,在缓冲区中指定了偏移量。DatagramPacket(bytebuf,intoffset,intlength,InetAddressaddress,intport):构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。DatagramPacket(bytebuf,intoffset,intlength,SocketAddressaddress):构造数据报包,用来将长度为 length 偏移量为 offset 的包发送到指定主机上的指定端口号。DatagramPacket(bytebuf,intlength,SocketAddressaddress):构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号。DatagramPacket类中的常用函数有:void setData(byte buf):设置数据缓冲区。byte getData():返回数据缓冲区。getLength():返回发送或接收数据报的长度。(2)DatagramSocket类DatagramSocket类是用来发送或接收数据报的Socket,其构造方法如下:DatagramSocket():构造一个用于发送的DatagramSocket。DatagramSocket(intport):构造一个用于接收的DatagramSocket,参数为接收端口号。(3)发送和接收过程下面代码给出了数据报接收和发送的编程要点,接收端的IP地址是192.168.0.3,端口号是80,发送的数据在缓冲区message中,长度为200。接收端的程序:byte inbuffer=new byte1024;/设置缓冲区DatagramPacket inpacket=new DatagramPacket(inbuffer,inbuffer.length);DatagramSocket insocket=new DatagramSocket(80);/设置端口号insocket.receive(inpacket);/接收数据报String s=new String(inbuffer,0,0,inpacket.getLength();/将接收的数据存入字符串。发送端程序:/message为存放发送数据的字节数组DatagramPacket outpacket=new DatagramPacket(message,200,192.168.0.3,80);DatagramSocket outsocket=new DatagramSocket();outsocket.send(outpacket);讲后练习讲后练习1、编写java程序,利用URL对象读取网络上文件的内容。2、编写程序实现:客户端(Client.java)向服务器(Server.java)端请求(请求是一句话,为一个String)。如果这句话的内容字符串是字符串“plain”的话,服务器仅将“Hello”字符串返回给用户。否则将用户的话加到当前目录的文本稳健Memo.txt中,并向用户返回“OK”。3、让(2)中的Server.java能并发的处理多用户,并编写程序模拟多个用户向服务器发送请求。4、用一个套接字(Socket)完成,由客户端指定一个服务器上的文件名,让服务器发回该文件的内容,或者提示文件不存在。5、编写程序,用面向连接的网络通信实现一个远程加法器;客户端向服务器发送两个数;服务器计算两个数的和,返回给客户端。分别写出客户端和服务器端的程序。