第11章Java网络编程.ppt
Java第第1111章章 JavaJava网络编程网络编程 Java套接字通信套接字通信套接字通信套接字通信 2网络通信方式网络通信方式网络通信方式网络通信方式 3 1数据报通信数据报通信数据报通信数据报通信 3 3本章内容提要本章内容提要 Java1 1 1 1网络通信方式网络通信方式网络通信方式网络通信方式 网络的通信形式在传输层中主要有两种,即面向网络的通信形式在传输层中主要有两种,即面向网络的通信形式在传输层中主要有两种,即面向网络的通信形式在传输层中主要有两种,即面向连接的通信方式和面向无连接的通信方式。连接的通信方式和面向无连接的通信方式。连接的通信方式和面向无连接的通信方式。连接的通信方式和面向无连接的通信方式。面向连接的通信方式指双方通信前需要首先建立面向连接的通信方式指双方通信前需要首先建立面向连接的通信方式指双方通信前需要首先建立面向连接的通信方式指双方通信前需要首先建立连接,然后再进行数据的传递,所有数据以包的形连接,然后再进行数据的传递,所有数据以包的形连接,然后再进行数据的传递,所有数据以包的形连接,然后再进行数据的传递,所有数据以包的形式按照一定的顺序发送和接收,直到关闭连接,通式按照一定的顺序发送和接收,直到关闭连接,通式按照一定的顺序发送和接收,直到关闭连接,通式按照一定的顺序发送和接收,直到关闭连接,通信结束为止。信结束为止。信结束为止。信结束为止。面向无连接的通信方式指双方通信前不需要建立面向无连接的通信方式指双方通信前不需要建立面向无连接的通信方式指双方通信前不需要建立面向无连接的通信方式指双方通信前不需要建立连接,双方直接利用数据报来发送和接收相互的数连接,双方直接利用数据报来发送和接收相互的数连接,双方直接利用数据报来发送和接收相互的数连接,双方直接利用数据报来发送和接收相互的数据,是一种非可靠的无连接投递报文的通信方式。据,是一种非可靠的无连接投递报文的通信方式。据,是一种非可靠的无连接投递报文的通信方式。据,是一种非可靠的无连接投递报文的通信方式。11.1 11.1 网络编程基本知识网络编程基本知识 Java 通信协议实际上就是计算机和网络设备之通信协议实际上就是计算机和网络设备之通信协议实际上就是计算机和网络设备之通信协议实际上就是计算机和网络设备之间进行通信时需要遵守的一组规定和约定的集间进行通信时需要遵守的一组规定和约定的集间进行通信时需要遵守的一组规定和约定的集间进行通信时需要遵守的一组规定和约定的集合。针对网络通信方式的不同,网络上主机之合。针对网络通信方式的不同,网络上主机之合。针对网络通信方式的不同,网络上主机之合。针对网络通信方式的不同,网络上主机之间的应用程序在传输层进行的通信协议也有两间的应用程序在传输层进行的通信协议也有两间的应用程序在传输层进行的通信协议也有两间的应用程序在传输层进行的通信协议也有两种:种:种:种:TCPTCPTCPTCP(传输控制协议)和(传输控制协议)和(传输控制协议)和(传输控制协议)和UDPUDPUDPUDP(用户数据报(用户数据报(用户数据报(用户数据报协议)。协议)。协议)。协议)。11.1 11.1 网络编程基本知识网络编程基本知识 Java(1)TCP(1)TCP(1)TCP(1)TCP TCP TCP TCP TCP是一种面向连接的保证可靠传输的通信协议,是一种面向连接的保证可靠传输的通信协议,是一种面向连接的保证可靠传输的通信协议,是一种面向连接的保证可靠传输的通信协议,由于其连接的建立需要通过三次协商完成,因此也被由于其连接的建立需要通过三次协商完成,因此也被由于其连接的建立需要通过三次协商完成,因此也被由于其连接的建立需要通过三次协商完成,因此也被称为称为称为称为“三次握手三次握手三次握手三次握手”协议。协议。协议。协议。(2)UDP(2)UDP(2)UDP(2)UDP UDP UDP UDP UDP是一种无连接的通信传输层协议,每个数据报是一种无连接的通信传输层协议,每个数据报是一种无连接的通信传输层协议,每个数据报是一种无连接的通信传输层协议,每个数据报都封装在一个独立的都封装在一个独立的都封装在一个独立的都封装在一个独立的IPIPIPIP分组里,包括完整的源地址和分组里,包括完整的源地址和分组里,包括完整的源地址和分组里,包括完整的源地址和目的地址,在到达目的地时,到达顺序以及内容的正目的地址,在到达目的地时,到达顺序以及内容的正目的地址,在到达目的地时,到达顺序以及内容的正目的地址,在到达目的地时,到达顺序以及内容的正确性都是不能保证的。确性都是不能保证的。确性都是不能保证的。确性都是不能保证的。11.1 11.1 网络编程基本知识网络编程基本知识 Java 套接字是套接字是套接字是套接字是IPIPIPIP地址和端口号的组合,其中用地址和端口号的组合,其中用地址和端口号的组合,其中用地址和端口号的组合,其中用IPIPIPIP地址标识被访地址标识被访地址标识被访地址标识被访问的计算机,端口号被规定为一个问的计算机,端口号被规定为一个问的计算机,端口号被规定为一个问的计算机,端口号被规定为一个065535065535065535065535之间的整数之间的整数之间的整数之间的整数(01023010230102301023已被操作系统预定),用于标识正在计算机上运行的已被操作系统预定),用于标识正在计算机上运行的已被操作系统预定),用于标识正在计算机上运行的已被操作系统预定),用于标识正在计算机上运行的一个网络程序(一个网络程序(一个网络程序(一个网络程序(IPIPIPIP地址就像某栋建筑物的地址,端口号就像某地址就像某栋建筑物的地址,端口号就像某地址就像某栋建筑物的地址,端口号就像某地址就像某栋建筑物的地址,端口号就像某栋建筑物中的房间号)。栋建筑物中的房间号)。栋建筑物中的房间号)。栋建筑物中的房间号)。套接字通信以套接字通信以套接字通信以套接字通信以TCPTCPTCPTCP协议为基础,通信双方首先利用套接字建协议为基础,通信双方首先利用套接字建协议为基础,通信双方首先利用套接字建协议为基础,通信双方首先利用套接字建立连接,因此需要分别设计两个程序位于通信两端,由一端发立连接,因此需要分别设计两个程序位于通信两端,由一端发立连接,因此需要分别设计两个程序位于通信两端,由一端发立连接,因此需要分别设计两个程序位于通信两端,由一端发出连接请求,另一端接受请求并建立连接,然后进行通信。此出连接请求,另一端接受请求并建立连接,然后进行通信。此出连接请求,另一端接受请求并建立连接,然后进行通信。此出连接请求,另一端接受请求并建立连接,然后进行通信。此时,请求方被称为客户端,接受方被称为服务器端。这种需要时,请求方被称为客户端,接受方被称为服务器端。这种需要时,请求方被称为客户端,接受方被称为服务器端。这种需要时,请求方被称为客户端,接受方被称为服务器端。这种需要分别设计客户端(分别设计客户端(分别设计客户端(分别设计客户端(ClientClientClientClient)和服务器端()和服务器端()和服务器端()和服务器端(ServerServerServerServer)的程序结构)的程序结构)的程序结构)的程序结构被称为客户被称为客户被称为客户被称为客户/服务器(服务器(服务器(服务器(C/SC/SC/SC/S)结构。)结构。)结构。)结构。11.2 11.2 套接字通信套接字通信 Java1.1.1.1.服务器端套接字服务器端套接字服务器端套接字服务器端套接字 服务器端程序需要首先定义服务器端套接服务器端程序需要首先定义服务器端套接服务器端程序需要首先定义服务器端套接服务器端程序需要首先定义服务器端套接字,提供给客户端程序进行访问。字,提供给客户端程序进行访问。字,提供给客户端程序进行访问。字,提供给客户端程序进行访问。.ServerS.ServerS.ServerS.ServerSocket类用于进行服务器端套类用于进行服务器端套类用于进行服务器端套类用于进行服务器端套接字的操作,其中的构造方法接字的操作,其中的构造方法接字的操作,其中的构造方法接字的操作,其中的构造方法ServerSocket(intServerSocket(intServerSocket(intServerSocket(int port)port)port)port)可定义服务器端套接字可定义服务器端套接字可定义服务器端套接字可定义服务器端套接字对象,参数对象,参数对象,参数对象,参数portportportport为指定要访问的服务器端程序的为指定要访问的服务器端程序的为指定要访问的服务器端程序的为指定要访问的服务器端程序的端口号。端口号。端口号。端口号。11.2 11.2 套接字通信套接字通信 Java2.2.2.2.客户端套接字客户端套接字客户端套接字客户端套接字 客户端程序需要定义客户端套接字,指定要客户端程序需要定义客户端套接字,指定要客户端程序需要定义客户端套接字,指定要客户端程序需要定义客户端套接字,指定要连接的计算机连接的计算机连接的计算机连接的计算机IPIPIPIP地址和在这台计算机上被请求连地址和在这台计算机上被请求连地址和在这台计算机上被请求连地址和在这台计算机上被请求连接的服务器端程序的端口号。接的服务器端程序的端口号。接的服务器端程序的端口号。接的服务器端程序的端口号。包中的包中的包中的包中的SocketSocketSocketSocket类用于连接客户端套接字的操作,构造方类用于连接客户端套接字的操作,构造方类用于连接客户端套接字的操作,构造方类用于连接客户端套接字的操作,构造方法法法法Socket(StringSocket(StringSocket(StringSocket(String host,host,host,host,intintintint port)port)port)port)用于定义客户用于定义客户用于定义客户用于定义客户端套接字对象,参数端套接字对象,参数端套接字对象,参数端套接字对象,参数hosthosthosthost表示要访问的服务器端表示要访问的服务器端表示要访问的服务器端表示要访问的服务器端程序的程序的程序的程序的IPIPIPIP地址,参数地址,参数地址,参数地址,参数portportportport表示要访问的服务器端表示要访问的服务器端表示要访问的服务器端表示要访问的服务器端程序的端口号。定义一个客户端套接字对象即表程序的端口号。定义一个客户端套接字对象即表程序的端口号。定义一个客户端套接字对象即表程序的端口号。定义一个客户端套接字对象即表示向服务器端套接字发出一个连接请求。示向服务器端套接字发出一个连接请求。示向服务器端套接字发出一个连接请求。示向服务器端套接字发出一个连接请求。11.2 11.2 套接字通信套接字通信 Java3.3.3.3.通过套接字传递数据通过套接字传递数据通过套接字传递数据通过套接字传递数据 服务器端套接字和客户端套接字分别定义完毕后,就服务器端套接字和客户端套接字分别定义完毕后,就服务器端套接字和客户端套接字分别定义完毕后,就服务器端套接字和客户端套接字分别定义完毕后,就可以进行通信了。通信是通过数据流对象可以进行通信了。通信是通过数据流对象可以进行通信了。通信是通过数据流对象可以进行通信了。通信是通过数据流对象DataInputStreamDataInputStreamDataInputStreamDataInputStream和和和和DataOutputStreamDataOutputStreamDataOutputStreamDataOutputStream完成的,其中,服务器端的输入流读完成的,其中,服务器端的输入流读完成的,其中,服务器端的输入流读完成的,其中,服务器端的输入流读取客户端输出的数据,客户端的输入流读取服务器端输出取客户端输出的数据,客户端的输入流读取服务器端输出取客户端输出的数据,客户端的输入流读取服务器端输出取客户端输出的数据,客户端的输入流读取服务器端输出的数据,服务器端和客户端就是通过相互输入、输出的操的数据,服务器端和客户端就是通过相互输入、输出的操的数据,服务器端和客户端就是通过相互输入、输出的操的数据,服务器端和客户端就是通过相互输入、输出的操作完成数据通信的。作完成数据通信的。作完成数据通信的。作完成数据通信的。11.2 11.2 套接字通信套接字通信 Java例例例例11-111-1(1 1)客户端程序:)客户端程序:)客户端程序:)客户端程序:import java.io.*;import .*;public class Client public static void main(String args)String mess=您好!您好!,我是李雷。我是李雷。,请问,韩梅梅在请问,韩梅梅在吗?吗?;Socket mysocket;DataInputStream in=null;DataOutputStream out=null;try System.out.println(李雷打电话找韩梅梅。李雷打电话找韩梅梅。);11.2 11.2 套接字通信套接字通信 Java mysocket=new Socket(127.0.0.1,2012);in=new DataInputStream(mysocket.getInputStream();out=new DataOutputStream(mysocket.getOutputStream();for(int i=0;imess.length;i+)out.writeUTF(messi);String s=in.readUTF();System.out.println(对方说:对方说:+s);Thread.sleep(500);catch(Exception e)System.out.println(服务器已断开服务器已断开+e);11.2 11.2 套接字通信套接字通信 Java(2)服务器端程序:)服务器端程序:import java.io.*;import .*;public class Server public static void main(String args)String answer=您好!您好!,李雷您好。李雷您好。,我是韩梅我是韩梅梅。梅。;ServerSocket serverForClient=null;Socket socketOnServer=null;DataOutputStream out=null;DataInputStream in=null;try serverForClient=new ServerSocket(2010);11.2 11.2 套接字通信套接字通信 Java11.2 11.2 套接字通信套接字通信 catch(IOException e1)System.out.println(e1);try System.out.println(电话无人使用中电话无人使用中);socketOnServer=serverForClient.accept();System.out.println(电话铃响了,有人来电!电话铃响了,有人来电!);out=new DataOutputStream(socketOnServer.getOutputStream();in=new DataInputStream(socketOnServer.getInputStream();for(int i=0;ianswer.length;i+)String s=in.readUTF();Java System.out.println(对方说:对方说:+s);out.writeUTF(answeri);Thread.sleep(500);catch(Exception e)System.out.println(客户已断开客户已断开+e);11.2 11.2 套接字通信套接字通信 Java 数据报通信是以数据报通信是以数据报通信是以数据报通信是以UDPUDPUDPUDP为通信协议的一种无连接的通信方为通信协议的一种无连接的通信方为通信协议的一种无连接的通信方为通信协议的一种无连接的通信方式。数据报又称为式。数据报又称为式。数据报又称为式。数据报又称为UDPUDPUDPUDP套接字,它无需建立、拆除连接,而套接字,它无需建立、拆除连接,而套接字,它无需建立、拆除连接,而套接字,它无需建立、拆除连接,而是直接将信息打包传向指定的目的地,使用简单,占用系是直接将信息打包传向指定的目的地,使用简单,占用系是直接将信息打包传向指定的目的地,使用简单,占用系是直接将信息打包传向指定的目的地,使用简单,占用系统资源少,适合于非实时的通信。统资源少,适合于非实时的通信。统资源少,适合于非实时的通信。统资源少,适合于非实时的通信。1.DatagramSocket 1.DatagramSocket 1.DatagramSocket 1.DatagramSocket类和类和类和类和DatagramPacketDatagramPacketDatagramPacketDatagramPacket类类类类 Java Java Java Java语言提供了两个类语言提供了两个类语言提供了两个类语言提供了两个类DatagramSocketDatagramSocketDatagramSocketDatagramSocket和和和和DatagramPacketDatagramPacketDatagramPacketDatagramPacket用来支持数据报通信,它们位于包用来支持数据报通信,它们位于包用来支持数据报通信,它们位于包用来支持数据报通信,它们位于包中。其中,中。其中,中。其中,中。其中,DatagramSocketDatagramSocketDatagramSocketDatagramSocket用于在程序之间建立用于在程序之间建立用于在程序之间建立用于在程序之间建立传送数据报的通信连接,传送数据报的通信连接,传送数据报的通信连接,传送数据报的通信连接,DatagramPacketDatagramPacketDatagramPacketDatagramPacket则用来表示一个则用来表示一个则用来表示一个则用来表示一个数据报。数据报。数据报。数据报。11.3 11.3 数据报通信数据报通信 Java11.3 11.3 数据报通信数据报通信 DatagramSocketDatagramSocket类有三个构造方法:类有三个构造方法:DatagramSocketDatagramSocket()()DatagramSocket(intDatagramSocket(int protprot)DatagramSocket(intDatagramSocket(int port,port,InetAddressInetAddress laddrladdr)各构造方法中,参数各构造方法中,参数portport指明指明socketsocket所使用的端口号,所使用的端口号,如果未指明端口号,则把如果未指明端口号,则把socketsocket连接到本地主机上一个可连接到本地主机上一个可用的端口。参数用的端口。参数laddrladdr指明一个可用的地址。给出端口号时指明一个可用的地址。给出端口号时要保证不发生端口冲突,否则会生成要保证不发生端口冲突,否则会生成SocketExceptionSocketException类异类异常。常。JavaDatagramPacketDatagramPacket有四个构造方法:有四个构造方法:DatagramPacket(byteDatagramPacket(byte buf,intbuf,int length)length)DatagramPacket(byteDatagramPacket(byte bufbuf,intint length,length,InetAddressInetAddress addraddr,intint port)port)DatagramPacket(byteDatagramPacket(byte bufbuf,intint offset,offset,intint length)length)DatagramPacket(byteDatagramPacket(byte bufbuf,intint offset,offset,intint length,length,InetAddressInetAddress address,address,intint port)port)各构造方法中,参数各构造方法中,参数bufbuf指明数据的存储位置,参数指明数据的存储位置,参数lengthlength指明存储在指明存储在bufbuf中的数据的个数,参数中的数据的个数,参数addraddr和和portport指明指明数据传输目的地址和端口,数据传输目的地址和端口,offsetoffset指明了从指明了从bufbuf的哪一个位置的哪一个位置开始存放数据。开始存放数据。11.3 11.3 数据报通信数据报通信 Java2.2.通过数据报传递数据通过数据报传递数据 例11-2(1)客户端程序:public class public class UDPClientUDPClient public static void public static void main(Stringmain(String argsargs)try try DatagramSocketDatagramSocket dSocketdSocket=new =new DatagramSocketDatagramSocket();();byte buffer=new byte1024;byte buffer=new byte1024;System.out.printSystem.out.print(输入发送的信息:输入发送的信息:););System.in.read(bufferSystem.in.read(buffer););DatagramPacketDatagramPacket packet=new packet=new DatagramPacket(bufferDatagramPacket(buffer,buffer.lengthbuffer.length,InetAddress.getByName(127.0.0.1),8008);InetAddress.getByName(127.0.0.1),8008);11.3 11.3 数据报通信数据报通信 Java dSocket.send(packetdSocket.send(packet););System.out.printlnSystem.out.println(客户端发送数据报完毕客户端发送数据报完毕!);!);dSocket.receive(packetdSocket.receive(packet););System.out.printlnSystem.out.println(客户端接收返回的数据报客户端接收返回的数据报!);!);catch(IOExceptioncatch(IOException e)e)System.out.println(e.toStringSystem.out.println(e.toString();();(2 2)服务端程序:)服务端程序:import import .*;.*;import import java.iojava.io.*;.*;public class public class UDPServerUDPServer public static void public static void main(Stringmain(String argsargs)try try 11.3 11.3 数据报通信数据报通信 Java11.3 11.3 数据报通信数据报通信 DatagramSocket dSocket=new DatagramSocket dSocket=new DatagramSocket(8008);DatagramSocket(8008);byte buffer=new byte1024;byte buffer=new byte1024;DatagramPacket packet=new DatagramPacket packet=new DatagramPacket(buffer,buffer.length);DatagramPacket(buffer,buffer.length);dSocket.receive(packet);dSocket.receive(packet);System.out.println(System.out.println(服务器收到数据报服务器收到数据报!);!);dSocket.send(packet);dSocket.send(packet);catch(SocketExceptioncatch(SocketException e)e)System.out.println(e.toStringSystem.out.println(e.toString();();catch(IOExceptioncatch(IOException e)e)System.out.println(e.toStringSystem.out.println(e.toString();();