《清华大学张思民Java》由会员分享,可在线阅读,更多相关《清华大学张思民Java(42页珍藏版)》请在金锄头文库上搜索。
1、Java语言程序设计第9章 网络通信主讲:张思民主讲:张思民清华大学清华大学主要内容主要内容n1、网络编程基础、网络编程基础n2、基于、基于TCP网络程序设计网络程序设计n3、基于、基于UDP网络程序设计网络程序设计n4、* * 基于基于C/S模式的分布计算模式的分布计算2一、一、 Java与网络与网络 IP协议、协议、 TCP协议和协议和UDP协议。协议。1、网络数据通信的几个重要协议、网络数据通信的几个重要协议 3 源源IP地址地址 目的目的IP地址地址 IP 数据报结构数据报结构4传输层数据报文结构:传输层数据报文结构:TCP5传输层数据报结构:传输层数据报结构:UDP报文报文62、端口
2、号、端口号n端口号端口号:TCP/IP协议为每种服务协议为每种服务定义了一个端口。定义了一个端口。服务端口号服务端口号ftp 21http 80pop3 110 73、 套接字套接字SocketnSocket是网络程序中最常用的方式,是网络程序中最常用的方式,用于建立两个不同程序之间通过网络用于建立两个不同程序之间通过网络进行通信的信道。进行通信的信道。82、 套接字套接字Socket什么是什么是socket ?网络服务网络服务Mailftpfinger20telnet数据结构数据结构I/O缓冲区缓冲区端口端口2123客户程序客户程序SocketIP,port套接字是套接字是IP与端口的组与端
3、口的组合合,可以分辨在可以分辨在internet上运行的程序上运行的程序9进程与进程之间建立起连接进程与进程之间建立起连接10建立套接字建立套接字Socketn在客户端使用在客户端使用socket类,指定服务器类,指定服务器IP和端口号和端口号,以便连到服务器上以便连到服务器上: Socket(host_IP, prot); 在服务器端使用在服务器端使用ServerSocket类,类,以等待客户端的连接以等待客户端的连接: ServerSocket(port);客户端呼叫客户端呼叫服务器等待服务器等待11Socket主要方法:主要方法:在客户端:建立在客户端:建立socket连接后连接后,还应
4、该还应该建立输入输出数据流。建立输入输出数据流。 getInputStream( ) 获得输入流获得输入流 getOutputStream( ) 获得输出流获得输出流在服务器端:在服务器端:ServerSocket类的类的accept( )方法使服务方法使服务器处于阻塞状态器处于阻塞状态,等待用户请求。等待用户请求。12ClientSocket(host, port #)Attempt the connectionOutputStreamInputStreamClose Socket二、二、TCP协议协议 Socket编程编程ServerServerSocket(port #)Server S
5、ocket.accept()Socket()OutputStreamInputStreamClose Socket13例例1:演示服务器与客户之间的:演示服务器与客户之间的交互交互,服务器等待服务器等待,客户访问客户访问,相相互通一次信息。互通一次信息。 客户端向服务器发出信息:客户端向服务器发出信息:“你好你好”,服务器接收到信,服务器接收到信息后,给出回应:息后,给出回应:“你好,你好,我是服务器。我是服务器。”1421.5 Socket. 21.5 Socket创建服务器创建服务器(端口号端口号)定义数据成员定义数据成员服务器等待服务器等待网络连接网络连接建立建立socket流流读客户读
6、客户 端信息端信息向用户发出确认字符串向用户发出确认字符串创建创建Socket实例实例定义数据成员定义数据成员建立建立socket流流读读socket流流(接收并显示接收并显示)送用户名给送用户名给服务器服务器关闭流关闭流waiting for user127.0.0.1 43314331“这里是服务器这里是服务器connetcting client.你好你好提示用户登录成功提示用户登录成功读读socket流流15客户机端客户机端nimport java.io.*;nimpor.*;nclass C nnpublic static void main(String args) nn tryn
7、Socket socket=new Socket(127.0.0.1,6565);n DataOutputStream out=new DataOutputStream(socket.getOutputStream();n out.writeUTF(我是客户机我是客户机);n DataInputStream in=new DataInputStream(socket.getInputStream();n String s=in.readUTF();n System.out.println(客户机收到:客户机收到:+s);n catch(Exception e)nn16服务器端服务器端nimpo
8、rt java.io.*;nimpor.*;nclass Snnpublic static void main(String args) nn tryn ServerSocket s_socket=new ServerSocket(6565);n Socket socket=s_socket.accept();n DataInputStream in=new DataInputStream(socket.getInputStream();n String s=in.readUTF();n System.out.println(服务器收到:服务器收到:+s);n DataOutputStream
9、 out=new DataOutputStream(socket.getOutputStream();n out.writeUTF(我是服务器我是服务器);n catch(Exception e)nn1721.5 Socketn显示服务器与客户机间的通信显示服务器与客户机间的通信( (服务器端服务器端) )DataOutputStream out=null;DataOutputStream out=null;DataInputStream in=null;DataInputStream in=null;ServerSocket s_socket=null;ServerSocket s_sock
10、et=null;Socket c_socket=null;Socket c_socket=null;String s; String s; /存放读取到的信息存放读取到的信息try s_socket=new ServerSocket(4331);try s_socket=new ServerSocket(4331); catch (IOException e) catch (IOException e) try c_socket=s_socket.accept();try c_socket=s_socket.accept(); catch (IOException e) catch (IOEx
11、ception e) 创建服务器创建服务器(端口号端口号)定义数据成员定义数据成员服务器等待服务器等待网络连接网络连接用循环语句收用循环语句收发信息发信息(见下页见下页)18in=new DataInPutStream(clientSocket.getInputStream();out=new DataOutputStream(clientSocket.getOutputStream(); 创建服务器创建服务器(端口号端口号)定义数据成员定义数据成员服务器等待服务器等待网络连接网络连接建立建立socket流流等待客户登录等待客户登录 out.writeUTF(“这里是服务器这里是服务器); c
12、lientSocket.close();While (true) s=in.readUTF( ); if ( s!=null ) break; 读客户读客户 端信息端信息19创建创建Socket实例实例DataOutputStream out=null;DataInputStream in=null;String string;Socket socket=null;定义数据成员定义数据成员trysocket=new Socket(127.0.0.1,4331);input=new DataInputStream(socket.getInputStream();output=new PrintS
13、tream(socket.getOutputStream();建立建立socket流流catch(IOException e) System.out.println(“无法连接无法连接 ”); 20Out.writeUTF(“你好你好”);System.out.println(input.readLine();创建创建Socket实例实例定义数据成员定义数据成员建立建立socket流流读读socket流流(看到提示看到提示)从键盘上读送用户从键盘上读送用户名送给服务器端名送给服务器端关闭流关闭流mysocket.close();System.out.println(“s);读服务器反馈读服务器
14、反馈While (true) s=in.readUTF( ); if ( s!=null ) break; 21考虑多用户考虑多用户第一种解决方案第一种解决方案:n一台计算机上一次启动多个服务器一台计算机上一次启动多个服务器程序程序,只是端口号不同。只是端口号不同。nmyserver myclient-f21.batnmyserver2myclient2-f9.batServer1(1111)client(2222)Server2(2222)client(1111)22多用户的第二种方案多用户的第二种方案(支持多客户支持多客户)Serverclient1client2serverthreads
15、erverthread将服务器写成多线程的将服务器写成多线程的,不同的线程为不不同的线程为不同的客户服务同的客户服务.main()只负责循环等待只负责循环等待线程负责网络连接线程负责网络连接,接收客户输入的信息接收客户输入的信息23 客户客户1客户客户2服务器服务器线程线程run()线程线程1( )线程线程2( )下面简单分析下面简单分析 教材教材P276 例例4 24client()Run( )Out.writeUTF()In.readUTF()客户端客户端writer.start()按钮事件按钮事件()socketgetInputStreamgetOutputStream服务器25服务器端
16、服务器端n.服务器服务器(4321)acceptsocket客客户户IP client1线程线程客客户户IP client2线程线程服务器一端为了能接收多个客户的信息服务器一端为了能接收多个客户的信息,它的输它的输入流入流,输出流都是数组型的输出流都是数组型的.ServerSocket.accept()等待用户连接等待用户连接,一旦连接上一旦连接上,则调用服务程序则调用服务程序.服务程序的主要内容是网络的读写服务程序的主要内容是网络的读写,多客户的原多客户的原因因,网络读写的功能用多线程实现网络读写的功能用多线程实现,因此将此部分因此将此部分功能单独分离出来功能单独分离出来,构成线程类构成线程
17、类26服务器端服务器端client1client2serviceRequestserverServerSocketSocketgetOutputStreamgetInputStreamreader.runreader.runaccept()reader.start()read_net_inputwrite_net_output()27n在在Java中中,网络类都在网络类都在 类库中。类库中。n用来存储用来存储internet地址的类地址的类InetAddress. 其主要方法:其主要方法:ngetHostName( ) 获取获取InetAddress对象的主对象的主机名或域名机名或域名nget
18、HostAddress( ) 获取获取InetAddress对象对象的的IP地址地址ngetLocalHost( )获取本机的获取本机的IP地址地址28n例例:获取本机的获取本机的IP地址地址impor.*;public class getLocalHostTest public static void main(String args) InetAddress myIP=null; try myIP=InetAddress.getLocalHost(); catch(UnknownHostException e) System.out.println(myIP); 创建创建inetAddre
19、ss类不用构造函数类不用构造函数(不用不用new)29Java与网络与网络下面的例子演示下面的例子演示java如何根据域名自动到如何根据域名自动到DNS上查找上查找IP地址地址(与与DNS服务器的连接减至一行服务器的连接减至一行)impor.*;public class getIP public static void main(String args) InetAddress pku=null; try pku= InetAddress.getByName(“”); catch(UnknownHostException e) System.out.println(pku); 30三、基于数据
20、报三、基于数据报DatagramnTCP/IP传输层由两个并列的协议传输层由两个并列的协议:TCP,UDP.UDP数据报的每个数据包要包含目的数据报的每个数据包要包含目的地址和端口号地址和端口号.socketserverclientDatagram数据报数据报serverclient31在在UDP中,要使用二个类:中,要使用二个类: (1) DatagramSocket 类类发送时,用发送时,用 send( )方法发送数据;方法发送数据;接收时,用接收时,用 receive( )方法接收数据。方法接收数据。(2) DatagramPacket 类类 用于打包或拆包用于打包或拆包 发送时打包:发
21、送时打包: 包由数据、接收地址、端口号组成;包由数据、接收地址、端口号组成; 接收时拆包:接收时拆包: 取出包中的数据、接收地址、端口号。取出包中的数据、接收地址、端口号。32Datagram 工作过程工作过程建立数据报建立数据报socket();建立一个报文包建立一个报文包packet等待请求报文等待请求报文建立数据报建立数据报socket建立一个请求包建立一个请求包发出请求发出请求获得对方地址获得对方地址构成信息包构成信息包发送出去发送出去创建接收包创建接收包等待接收等待接收33Datagramn一、服务器端发出报文的步骤如下一、服务器端发出报文的步骤如下:n1. 定义数据成员定义数据成员
22、n DatagramSocket socket;n DatagramPacket packet;n InetAddress address;(用来存放接收方的地址用来存放接收方的地址)n int port; ;(用来存放接收方的端口号用来存放接收方的端口号)n2. 创建数据报文创建数据报文Socket对象对象n try socket=new DatagramSocket(1111);n catc.SocketException e) n socket 绑定到一个本地的可用端口绑定到一个本地的可用端口,等待接收客等待接收客户的请求户的请求.34Datagramn3.分配并填写数据缓冲区分配并填写
23、数据缓冲区(一个字节类型的数组一个字节类型的数组)n byte Buf=new byte256; n 存放从客户端接收的请求信息存放从客户端接收的请求信息.n4.创建一个创建一个DatagramPacketn packet=new DatagramPacket(Buf数组数组, 256长度长度);n 用来从用来从socket接收数据接收数据,它只有两个参数它只有两个参数n 5. 服务器阻塞服务器阻塞n socket.receive(packet);n 在客户的请求报道来之前一直等待在客户的请求报道来之前一直等待35Datagramn6. 从到来的包中得到地址和端口号从到来的包中得到地址和端口号
24、n InetAddress address=packet.getAddress();n int port=packet.getPort();n7. 将数据送入缓冲区将数据送入缓冲区n 或来自文件或来自文件,或键盘输入或键盘输入n8. 建立报文包建立报文包,用来从用来从socket上发送信息上发送信息n packet=new DatagramPacket n (buf,buf.length, address,port);n9. 发送数据包发送数据包 10.关闭关闭socketn socket.send(packet); socket.close();36Datagramn二、客户端接收包的步骤如
25、下二、客户端接收包的步骤如下:1. 定义数据成员定义数据成员 int port; InetAddress address; DatagramSocket socket; DatagramPacket packet; byte sendBuf=new byte256;2. 建立建立socket socket=new DatagramSocket();37Datagramn3. 向服务器发出请求报文向服务器发出请求报文n address=InetAddress.getByName(args0);n port=parseInt(args1);n packet=new n DatagramPacket
26、(sendBuf,256,address,port);n socket.send(packet);n 这个包本身带有客户端的信息这个包本身带有客户端的信息n4. 客户机等待应答客户机等待应答n packet=new DatagramPacket(sendBuf,256);n socket.receive(packet);(如果没有到就一直等待如果没有到就一直等待,因因此实用程序要设置时间限度此实用程序要设置时间限度) 38Datagram5. 处理接收到的数据处理接收到的数据 String received=new String(packet.getData(),0);nSystem.out.
27、println(received);n数据报套接字首先是强调发送方和接收方的区别数据报套接字首先是强调发送方和接收方的区别,同时同时也指出服务器和客户之间的不同也指出服务器和客户之间的不同:n一个客户机必须事先知道服务器的地址和端口一个客户机必须事先知道服务器的地址和端口,以便进以便进行出事连接行出事连接n一个服务器从它接收到的数据报文中读取客户端的地一个服务器从它接收到的数据报文中读取客户端的地址和端口址和端口.39小结小结n实现网络功能要靠实现网络功能要靠URL类类, URLConection类类, Socket类和类和DatagramSocket类类n网络上的数据传送是将网络连接转换成网
28、络上的数据传送是将网络连接转换成输入输出流输入输出流nDataInputStream和和DataOutputStream (PrintStream)是网间流的载体是网间流的载体.nURL适用于适用于web应用应用,如访问如访问http服务器服务器是高层服务是高层服务40小结小结n环回地址可用于在本地机器上调试网络程序环回地址可用于在本地机器上调试网络程序nSocket适用于面向连接的适用于面向连接的,可靠性要求高的应用可靠性要求高的应用nDatagram适用于效率要求高的应用适用于效率要求高的应用nSocket是由是由IP和端口构成的一种网上通信链路和端口构成的一种网上通信链路的一端的一端nSocket通信要分别运行服务器和客户程序通信要分别运行服务器和客户程序n服务器程序是多线程的服务器程序是多线程的,可处理多个客户的请可处理多个客户的请求求41作业作业n编写一个会话程序编写一个会话程序n要求要求:n会话双方可以自由通话会话双方可以自由通话,看到对方发看到对方发来来“bye”则退出则退出42