大学Java讲义第9章_第1页
大学Java讲义第9章_第2页
大学Java讲义第9章_第3页
大学Java讲义第9章_第4页
大学Java讲义第9章_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

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协议为每种服务协

2、议为每种服务定义了一个端口。定义了一个端口。服务端口号服务端口号ftp 21http 80pop3 110 83、 套接字套接字SocketnSocket是网络程序中最常用的方式,是网络程序中最常用的方式,用于建立两个不同程序之间通过网络用于建立两个不同程序之间通过网络进行通信的信道。进行通信的信道。2、 套接字套接字Socket什么是什么是socket ?网络服务网络服务Mailftpfinger20telnet数据结构数据结构I/O缓冲区缓冲区端口端口2123客户程序客户程序SocketIP,port套接字是套接字是IP与端口的组与端口的组合合,可以分辨在可以分辨在internet上运行的

3、程序上运行的程序进程与进程之间建立起连接进程与进程之间建立起连接建立套接字建立套接字Socketn在客户端使用在客户端使用socket类,指定服务器类,指定服务器IP和端口号和端口号,以便连到服务器上以便连到服务器上: Socket(host_IP, prot); 在服务器端使用在服务器端使用ServerSocket类,类,以等待客户端的连接以等待客户端的连接: ServerSocket(port);客户端呼叫客户端呼叫服务器等待服务器等待12Socket主要方法:主要方法:在客户端:建立在客户端:建立socket连接后连接后,还应该还应该建立输入输出数据流。建立输入输出数据流。 getInp

4、utStream( ) 获得输入流获得输入流 getOutputStream( ) 获得输出流获得输出流在服务器端:在服务器端:ServerSocket类的类的accept( )方法使服务方法使服务器处于阻塞状态器处于阻塞状态,等待用户请求。等待用户请求。ClientSocket(host, port #)Attempt the connectionOutputStreamInputStreamClose Socket二、二、TCP协议协议 Socket编程编程ServerServerSocket(port #)Server Socket.accept()Socket()OutputStrea

5、mInputStreamClose Socket例例1:演示服务器与客户之间的:演示服务器与客户之间的交互交互,服务器等待服务器等待,客户访问客户访问,相互相互通一次信息。通一次信息。 客户端向服务器发出信息:客户端向服务器发出信息:“你好你好”,服务器接收到信,服务器接收到信息后,给出回应:息后,给出回应:“你好,你好,我是服务器。我是服务器。”21.5 Socket. 21.5 Socket创建服务器创建服务器(端口号端口号)定义数据成员定义数据成员服务器等待服务器等待网络连接网络连接建立建立socket流流读客户读客户 端信息端信息向用户发出确认字符串向用户发出确认字符串创建创建Sock

6、et实例实例定义数据成员定义数据成员建立建立socket流流读读socket流流(接收并显示接收并显示)送用户名给送用户名给服务器服务器关闭流关闭流waiting for user 43314331“这里是服务器这里是服务器connetcting client.你好你好提示用户登录成功提示用户登录成功读读socket流流16客户机端客户机端nimport java.io.*;nimport .*;nclass C nnpublic static void main(String args) nn tryn Socket socket=new Socket(,

7、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)nn17服务器端服务器端nimport java.io.*;nimport .*;nclass Snnp

8、ublic 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 out=new DataOutputStream(socket.

9、getOutputStream();n out.writeUTF(我是服务器我是服务器);n catch(Exception e)nn21.5 Socketn显示服务器与客户机间的通信显示服务器与客户机间的通信( (服务器端服务器端) )DataOutputStream out=null;DataOutputStream out=null;DataInputStream in=null;DataInputStream in=null;ServerSocket s_socket=null;ServerSocket s_socket=null;Socket c_socket=null;Socket

10、 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 (IOException e) 创建服务器创建服务器(端口号端口号)定义数据成员

11、定义数据成员服务器等待服务器等待网络连接网络连接用循环语句收用循环语句收发信息发信息(见下页见下页)in=new DataInPutStream(clientSocket.getInputStream();out=new DataOutputStream(clientSocket.getOutputStream(); 创建服务器创建服务器(端口号端口号)定义数据成员定义数据成员服务器等待服务器等待网络连接网络连接建立建立socket流流等待客户登录等待客户登录 out.writeUTF(“这里是服务器这里是服务器); clientSocket.close();While (true) s=in

12、.readUTF( ); if ( s!=null ) break; 读客户读客户 端信息端信息创建创建Socket实例实例DataOutputStream out=null;DataInputStream in=null;String string;Socket socket=null;定义数据成员定义数据成员trysocket=new Socket(,4331);input=new DataInputStream(socket.getInputStream();output=new PrintStream(socket.getOutputStream();建立建立sock

13、et流流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!=n

14、ull ) break; 考虑多用户考虑多用户第一种解决方案第一种解决方案:n一台计算机上一次启动多个服务器一台计算机上一次启动多个服务器程序程序,只是端口号不同。只是端口号不同。nmyserver myclient-f21.batnmyserver2myclient2-f9.batServer1(1111)client(2222)Server2(2222)client(1111)多用户的第二种方案多用户的第二种方案(支持多客户支持多客户)Serverclient1client2serverthreadserverthread将服务器写成多线程的将服务器写成多线程的,不同的线程为不不同的线程为

15、不同的客户服务同的客户服务.main()只负责循环等待只负责循环等待线程负责网络连接线程负责网络连接,接收客户输入的信息接收客户输入的信息 客户客户1客户客户2服务器服务器线程线程run()线程线程1( )线程线程2( )下面简单分析下面简单分析 教材教材P276 例例4 client()Run( )Out.writeUTF()In.readUTF()客户端客户端writer.start()按钮事件按钮事件()socketgetInputStreamgetOutputStream服务器服务器端服务器端n.服务器服务器(4321)acceptsocket客客户户IP client1线程线程客客户

16、户IP client2线程线程服务器一端为了能接收多个客户的信息服务器一端为了能接收多个客户的信息,它的输入它的输入流流,输出流都是数组型的输出流都是数组型的.ServerSocket.accept()等待用户连接等待用户连接,一旦连接上一旦连接上,则调用服务程序则调用服务程序.服务程序的主要内容是网络的读写服务程序的主要内容是网络的读写,多客户的原因多客户的原因,网络读写的功能用多线程实现网络读写的功能用多线程实现,因此将此部分功因此将此部分功能单独分离出来能单独分离出来,构成线程类构成线程类服务器端服务器端client1client2serviceRequestserverServerSo

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

18、( )获取本机的获取本机的IP地址地址n例例:获取本机的获取本机的IP地址地址import .*;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如何

19、根据域名自动到如何根据域名自动到DNS上查找上查找IP地址地址(与与DNS服务器的连接减至一行服务器的连接减至一行)import .*;public class getIP public static void main(String args) InetAddress pku=null; try pku= InetAddress.getByName(“”); catch(UnknownHostException e) System.out.println(pku); 三、基于数据报三、基于数据报DatagramnTCP/IP传输层由两个并列的协传输层由两个并列的协议议:TCP,UDP.UDP

20、数据报的每个数据包要包含目的数据报的每个数据包要包含目的地址和端口号地址和端口号.socketserverclientDatagram数据报数据报serverclient在在UDP中,要使用二个类:中,要使用二个类: (1) DatagramSocket 类类发送时,用发送时,用 send( )方法发送数据;方法发送数据;接收时,用接收时,用 receive( )方法接收数据。方法接收数据。(2) DatagramPacket 类类 用于打包或拆包用于打包或拆包 发送时打包:发送时打包: 包由数据、接收地址、端口号组成;包由数据、接收地址、端口号组成; 接收时拆包:接收时拆包: 取出包中的数据

21、、接收地址、端口号。取出包中的数据、接收地址、端口号。Datagram 工作过程工作过程建立数据报建立数据报socket();建立一个报文包建立一个报文包packet等待请求报文等待请求报文建立数据报建立数据报socket建立一个请求包建立一个请求包发出请求发出请求获得对方地址获得对方地址构成信息包构成信息包发送出去发送出去创建接收包创建接收包等待接收等待接收Datagramn一、服务器端发出报文的步骤如下一、服务器端发出报文的步骤如下:n1. 定义数据成员定义数据成员n DatagramSocket socket;n DatagramPacket packet;n InetAddress a

22、ddress;(用来存放接收方的地址用来存放接收方的地址)n int port; ;(用来存放接收方的端口号用来存放接收方的端口号)n2. 创建数据报文创建数据报文Socket对象对象n try socket=new DatagramSocket(1111);n catch(.SocketException e) n socket 绑定到一个本地的可用端口绑定到一个本地的可用端口,等待接收客等待接收客户的请求户的请求.Datagramn3.分配并填写数据缓冲区分配并填写数据缓冲区(一个字节类型的数组一个字节类型的数组)n byte Buf=new byte256; n 存放从客户端接收的请求信

23、息存放从客户端接收的请求信息.n4.创建一个创建一个DatagramPacketn packet=new DatagramPacket(Buf数组数组, 256长度长度);n 用来从用来从socket接收数据接收数据,它只有两个参数它只有两个参数n 5. 服务器阻塞服务器阻塞n socket.receive(packet);n 在客户的请求报道来之前一直等待在客户的请求报道来之前一直等待Datagramn6. 从到来的包中得到地址和端口号从到来的包中得到地址和端口号n InetAddress address=packet.getAddress();n int port=packet.getPo

24、rt();n7. 将数据送入缓冲区将数据送入缓冲区n 或来自文件或来自文件,或键盘输入或键盘输入n8. 建立报文包建立报文包,用来从用来从socket上发送信息上发送信息n packet=new DatagramPacket n (buf,buf.length, address,port);n9. 发送数据包发送数据包 10.关闭关闭socketn socket.send(packet); socket.close();Datagramn二、客户端接收包的步骤如下二、客户端接收包的步骤如下:1. 定义数据成员定义数据成员 int port; InetAddress address; Datag

25、ramSocket socket; DatagramPacket packet; byte sendBuf=new byte256;2. 建立建立socket socket=new DatagramSocket();Datagramn3. 向服务器发出请求报文向服务器发出请求报文n address=InetAddress.getByName(args0);n port=parseInt(args1);n packet=new n DatagramPacket(sendBuf,256,address,port);n socket.send(packet);n 这个包本身带有客户端的信息这个包本身带有客户端的信息n4. 客户机等待应答客户机等待应答n packet=new DatagramPacket(sendBuf,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论