清华大学张思民Java课件第9章(经典实用)

上传人:精****科 文档编号:214121179 上传时间:2021-11-22 格式:PPT 页数:43 大小:510.50KB
返回 下载 相关 举报
清华大学张思民Java课件第9章(经典实用)_第1页
第1页 / 共43页
清华大学张思民Java课件第9章(经典实用)_第2页
第2页 / 共43页
清华大学张思民Java课件第9章(经典实用)_第3页
第3页 / 共43页
清华大学张思民Java课件第9章(经典实用)_第4页
第4页 / 共43页
清华大学张思民Java课件第9章(经典实用)_第5页
第5页 / 共43页
点击查看更多>>
资源描述

《清华大学张思民Java课件第9章(经典实用)》由会员分享,可在线阅读,更多相关《清华大学张思民Java课件第9章(经典实用)(43页珍藏版)》请在金锄头文库上搜索。

1、Java语言程序设计第9章 网络通信清华大学主要内容n1、网络编程基础n2、基于TCP网络程序设计n3、基于UDP网络程序设计n4、* 基于C/S模式的分布计算一、 Java与网络 IP协议、 TCP协议和UDP协议。1、网络数据通信的几个重要协议 源IP地址 目的IP地址 IP 数据报结构传输层数据报文结构:TCP传输层数据报结构:UDP报文2、端口号n端口号:TCP/IP协议为每种服务定义了一个端口。服务端口号ftp 21http 80pop3 110 3、 套接字SocketnSocket是网络程序中最常用的方式,用于建立两个不同程序之间通过网络进行通信的信道。2、 套接字Socket什

2、么是socket ?网络服务Mailftpfinger20telnet数据结构I/O缓冲区端口2123客户程序SocketIP,port套接字是IP与端口的组合,可以分辨在internet上运行的程序进程与进程之间建立起连接建立套接字Socketn在客户端使用socket类,指定服务器IP和端口号,以便连到服务器上: Socket(host_IP, prot); 在服务器端使用ServerSocket类,以等待客户端的连接: ServerSocket(port);客户端呼叫服务器等待Socket主要方法:在客户端:建立socket连接后,还应该建立输入输出数据流。 getInputStream

3、( ) 获得输入流 getOutputStream( ) 获得输出流在服务器端:ServerSocket类的accept( )方法使服务器处于阻塞状态,等待用户请求。ClientSocket(host, port #)Attempt the connectionOutputStreamInputStreamClose Socket二、TCP协议 Socket编程ServerServerSocket(port #)Server Socket.accept()Socket()OutputStreamInputStreamClose Socket例1:演示服务器与客户之间的交互,服务器等待,客户访问

4、,相互通一次信息。 客户端向服务器发出信息:“你好”,服务器接收到信息后,给出回应:“你好,我是服务器。”21.5 Socket. 21.5 Socket创建服务器(端口号)定义数据成员服务器等待网络连接建立socket流读客户 端信息向用户发出确认字符串创建Socket实例定义数据成员建立socket流读socket流(接收并显示)送用户名给服务器关闭流waiting for user127.0.0.1 43314331“这里是服务器connetcting client.你好提示用户登录成功读socket流客户机端nimport java.io.*;nimport .*;nclass C n

5、npublic static void main(String args) nn tryn 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

6、catch(Exception e)nn服务器端nimport java.io.*;nimport .*;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(服务器

7、收到:+s);n DataOutputStream out=new DataOutputStream(socket.getOutputStream();n out.writeUTF(我是服务器);n catch(Exception e)nn21.5 Socketn显示服务器与客户机间的通信(服务器端)DataOutputStream out=null;DataInputStream in=null;ServerSocket s_socket=null;Socket c_socket=null;String s; /存放读取到的信息try s_socket=new ServerSocket(43

8、31); catch (IOException e) try c_socket=s_socket.accept(); catch (IOException e) 创建服务器(端口号)定义数据成员服务器等待网络连接用循环语句收发信息(见下页)in=new DataInPutStream(clientSocket.getInputStream();out=new DataOutputStream(clientSocket.getOutputStream(); 创建服务器(端口号)定义数据成员服务器等待网络连接建立socket流等待客户登录 out.writeUTF(“这里是服务器); client

9、Socket.close();While (true) s=in.readUTF( ); if ( s!=null ) break; 读客户 端信息创建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 PrintStream(socket.getOutputS

10、tream();建立socket流catch(IOException e) System.out.println(“无法连接 ”); Out.writeUTF(“你好”);System.out.println(input.readLine();创建Socket实例定义数据成员建立socket流读socket流(看到提示)从键盘上读送用户名送给服务器端关闭流mysocket.close();System.out.println(“s);读服务器反馈While (true) s=in.readUTF( ); if ( s!=null ) break; 考虑多用户第一种解决方案:n一台计算机上一次启

11、动多个服务器程序,只是端口号不同。nmyserver myclient-f21.batnmyserver2myclient2-f9.batServer1(1111)client(2222)Server2(2222)client(1111)多用户的第二种方案(支持多客户)Serverclient1client2serverthreadserverthread将服务器写成多线程的,不同的线程为不同的客户服务.main()只负责循环等待线程负责网络连接,接收客户输入的信息 客户1客户2服务器线程run()线程1( )线程2( )下面简单分析 教材P276 例4 client()Run( )Out.w

12、riteUTF()In.readUTF()客户端writer.start()按钮事件()socketgetInputStreamgetOutputStream服务器服务器端n.服务器(4321)acceptsocket客户IP client1线程客户IP client2线程服务器一端为了能接收多个客户的信息,它的输入流,输出流都是数组型的.ServerSocket.accept()等待用户连接,一旦连接上,则调用服务程序.服务程序的主要内容是网络的读写,多客户的原因,网络读写的功能用多线程实现,因此将此部分功能单独分离出来,构成线程类服务器端client1client2serviceReque

13、stserverServerSocketSocketgetOutputStreamgetInputStreamreader.runreader.runaccept()reader.start()read_net_inputwrite_net_output()n在Java中,网络类都在 类库中。n用来存储internet地址的类InetAddress. 其主要方法:ngetHostName( ) 获取InetAddress对象的主机名或域名ngetHostAddress( ) 获取InetAddress对象的IP地址ngetLocalHost( )获取本机的IP地址n例:获取本机的IP地址imp

14、ort .*;public class getLocalHostTest public static void main(String args) InetAddress myIP=null; try myIP=InetAddress.getLocalHost(); catch(UnknownHostException e) System.out.println(myIP); 创建inetAddress类不用构造函数(不用new)Java与网络下面的例子演示java如何根据域名自动到DNS上查找IP地址(与DNS服务器的连接减至一行)import .*;public class getIP p

15、ublic static void main(String args) InetAddress pku=null; try pku= InetAddress.getByName(“”); catch(UnknownHostException e) System.out.println(pku); 三、基于数据报DatagramnTCP/IP传输层由两个并列的协议:TCP,UDP.UDP数据报的每个数据包要包含目的地址和端口号.socketserverclientDatagram数据报serverclient在UDP中,要使用二个类: (1) DatagramSocket 类发送时,用 send

16、( )方法发送数据;接收时,用 receive( )方法接收数据。(2) DatagramPacket 类 用于打包或拆包 发送时打包: 包由数据、接收地址、端口号组成; 接收时拆包: 取出包中的数据、接收地址、端口号。Datagram 工作过程建立数据报socket();建立一个报文包packet等待请求报文建立数据报socket建立一个请求包发出请求获得对方地址构成信息包发送出去创建接收包等待接收Datagramn一、服务器端发出报文的步骤如下:n1. 定义数据成员n DatagramSocket socket;n DatagramPacket packet;n InetAddress address;(用来存放接收方的地址)n int port; ;(用来存放接收方的端口号)n2. 创建数据报文Socket对象n try socket=new DatagramSocket(1111);n catch(.SocketException e) n socket 绑定到一个本地的可用端口,等待接收客户的请求.Datagramn3.分配并填写数据缓冲区(一个字节类型的数组)n byte

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 高等教育 > 其它相关文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号