1 / 42

Java 语言程序设计

Java 语言程序设计. 主讲:张思民. 仰恩大学 Java 课程组. 第 9 章 网络通信. 主要内容. 1 、网络编程基础 2 、基于 TCP 网络程序设计 3 、基于 UDP 网络程序设计 4 、 * 基于 C/S 模式的分布计算. 一、 Java 与网络. IP 协议、 TCP 协议和 UDP 协议。. 1 、网络数据通信的几个重要协议. IP 数据报结构. 源 IP 地址. 目的 IP 地址. 传输层数据报文结构: TCP. 传输层数据报结构: UDP 报文. 2 、端口号.

Download Presentation

Java 语言程序设计

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Java语言程序设计 主讲:张思民 仰恩大学Java课程组 第9章 网络通信

  2. 主要内容 • 1、网络编程基础 • 2、基于TCP网络程序设计 • 3、基于UDP网络程序设计 • 4、* 基于C/S模式的分布计算

  3. 一、 Java与网络 IP协议、 TCP协议和UDP协议。 1、网络数据通信的几个重要协议

  4. IP 数据报结构 源IP地址 目的IP地址

  5. 传输层数据报文结构:TCP

  6. 传输层数据报结构:UDP报文

  7. 2、端口号 • 端口号:TCP/IP协议为每种服务定义了一个端口。 服务  端口号 ftp 21 http 80 pop3 110

  8. 3、套接字Socket • Socket是网络程序中最常用的方式,用于建立两个不同程序之间通过网络进行通信的信道。

  9. 网络服务 IP,port ftp 20 telnet 21 Socket 客户程序 Mail 23 finger 数据结构 I/O缓冲区 端口 2、套接字Socket 什么是socket ? 套接字是IP与端口的组合,可以分辨在internet上运行的程序

  10. 进程与进程之间建立起连接

  11. 建立套接字Socket 客户端呼叫 • 在客户端使用socket类,指定服务器IP和端口号,以便连到服务器上: Socket(host_IP, prot); 在服务器端使用ServerSocket类,以等待客户端的连接: ServerSocket(port); 服务器等待

  12. Socket主要方法: 在客户端:建立socket连接后,还应该建立输入输出数据流。 getInputStream( ) 获得输入流 getOutputStream( ) 获得输出流 在服务器端: ServerSocket类的accept( )方法使服务器处于阻塞状态,等待用户请求。

  13. Client Server Socket(host, port #) ServerSocket(port #) Attempt the connection Server Socket.accept() Socket() OutputStream OutputStream InputStream InputStream Close Socket Close Socket 二、TCP协议 Socket编程

  14. 例1:演示服务器与客户之间的交互,服务器等待,客户访问,相互通一次信息。例1:演示服务器与客户之间的交互,服务器等待,客户访问,相互通一次信息。 客户端向服务器发出信息:“你好”,服务器接收到信息后,给出回应:“你好,我是服务器。”

  15. . 21.5 Socket 定义数据成员 定义数据成员 21.5 Socket 4331 创建Socket实例 创建服务器(端口号) waiting for user 127.0.0.1 4331 服务器等待 网络连接 建立socket流 读socket流 (接收并显示) 建立socket流 connetcting client... “这里是服务器" 向用户发出确认字符串 送用户名给 服务器 你好 读客户 端信息 读socket流 提示用户登录成功 关闭流

  16. 客户机端 • import java.io.*; • import java.net.*; • class C • { • public static void main(String[] args) • { • try{ • Socket socket=new Socket("127.0.0.1",6565); • DataOutputStream out=new DataOutputStream(socket.getOutputStream()); • out.writeUTF("我是客户机"); • DataInputStream in=new DataInputStream(socket.getInputStream()); • String s=in.readUTF(); • System.out.println("客户机收到:"+s); • }catch(Exception e){} • } • }

  17. 服务器端 • import java.io.*; • import java.net.*; • class S • { • public static void main(String[] args) • { • try{ • ServerSocket s_socket=new ServerSocket(6565); • Socket socket=s_socket.accept(); • DataInputStream in=new DataInputStream(socket.getInputStream()); • String s=in.readUTF(); • System.out.println("服务器收到:"+s); • DataOutputStream out=new DataOutputStream(socket.getOutputStream()); • out.writeUTF("我是服务器"); • }catch(Exception e){} • } • }

  18. 21.5 Socket DataOutputStream out=null; DataInputStream in=null; ServerSocket s_socket=null; Socket c_socket=null; String s; //存放读取到的信息 定义数据成员 • 显示服务器与客户机间的通信(服务器端) 创建服务器(端口号) try { s_socket=new ServerSocket(4331); }catch (IOException e){ } 服务器等待 网络连接 try { c_socket=s_socket.accept(); …… }catch (IOException e){ } 用循环语句收发信息 (见下页)

  19. 定义数据成员 创建服务器(端口号) 服务器等待 网络连接 建立socket流 等待客户登录 读客户 端信息 in=new DataInPutStream(clientSocket.getInputStream()); out=new DataOutputStream(clientSocket.getOutputStream()); While (true) { s=in.readUTF( ); if ( s!=null ) break; } out.writeUTF(“这里是服务器"); clientSocket.close();

  20. DataOutputStream out=null; DataInputStream in=null; String string; Socket socket=null; 定义数据成员 创建Socket实例 try{ socket=new Socket("127.0.0.1",4331); 建立socket流 input=new DataInputStream(socket.getInputStream()); output=new PrintStream(socket.getOutputStream()); catch(IOException e){ System.out.println(“无法连接 ”); }

  21. 定义数据成员 创建Socket实例 建立socket流 Out.writeUTF(“你好”); System.out.println(input.readLine()); 读socket流 (看到提示) While (true) { s=in.readUTF( ); if ( s!=null ) break; } 从键盘上读送用户 名送给服务器端 读服务器反馈 mysocket.close(); System.out.println(“s"); 关闭流

  22. Server1(1111) client(1111) Server2(2222) client(2222) 考虑多用户 第一种解决方案: • 一台计算机上一次启动多个服务器程序,只是端口号不同。 • myserver <-------->myclient----f21.bat • myserver2<-------->myclient2----f9.bat

  23. 多用户的第二种方案 serverthread serverthread (支持多客户) Server client1 client2 将服务器写成多线程的,不同的线程为不同的客户服务. main()只负责循环等待 线程负责网络连接,接收客户输入的信息

  24. 线程1( ) 线程2( ) 服务器 客户1 客户2 线程run() 下面简单分析 教材P276 例4

  25. socket client() 客户端 getInputStream getOutputStream writer.start() 服 务 器 In.readUTF() Run( ) 按钮事件() Out.writeUTF()

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

  27. 服务器端 ServerSocket server Socket client1 accept() client2 serviceRequest read_net_input getInputStream write_net_output() getOutputStream reader.start() reader.run reader.run

  28. 在Java中,网络类都在 java.net 类库中。 • 用来存储internet地址的类InetAddress. 其主要方法: • getHostName( ) 获取InetAddress对象的主机名或域名 • getHostAddress( ) 获取InetAddress对象的IP地址 • getLocalHost( )获取本机的IP地址

  29. 例:获取本机的IP地址 import java.net.*; 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)

  30. Java与网络 下面的例子演示java如何根据域名自动到DNS 上查找IP地址(与DNS服务器的连接减至一行) import java.net.*; public class getIP { public static void main(String args[]) { InetAddress pku=null; try{ pku= InetAddress.getByName(“www.pku.edu.cn”); } catch(UnknownHostException e) {} System.out.println(pku); } }

  31. 三、基于数据报Datagram • TCP/IP传输层由两个并列的协议:TCP,UDP. UDP数据报的每个数据包要包含目的地址和端口号. socket client server Datagram数据报 server client

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

  33. Datagram 工作过程 建立数据报socket 建立数据报socket(); 建立一个报文包packet 建立一个请求包 发出请求 等待请求报文 创建接收包 获得对方地址 等待接收 构成信息包 发送出去

  34. Datagram • 一、服务器端发出报文的步骤如下: • 1. 定义数据成员 • DatagramSocket socket; • DatagramPacket packet; • InetAddress address;(用来存放接收方的地址) • int port; ;(用来存放接收方的端口号) • 2. 创建数据报文Socket对象 • try {socket=new DatagramSocket(1111);} • catch(java.net.SocketException e) {} • socket 绑定到一个本地的可用端口,等待接收客户的请求.

  35. Datagram • 3.分配并填写数据缓冲区(一个字节类型的数组) • byte[] Buf=new byte[256]; • 存放从客户端接收的请求信息. • 4.创建一个DatagramPacket • packet=new DatagramPacket(Buf数组, 256长度); • 用来从socket接收数据,它只有两个参数 • 5. 服务器阻塞 • socket.receive(packet); • 在客户的请求报道来之前一直等待

  36. Datagram • 6. 从到来的包中得到地址和端口号 • InetAddress address=packet.getAddress(); • int port=packet.getPort(); • 7. 将数据送入缓冲区 • 或来自文件,或键盘输入 • 8. 建立报文包,用来从socket上发送信息 • packet=new DatagramPacket • (buf,buf.length, address,port); • 9. 发送数据包 10.关闭socket • socket.send(packet); socket.close();

  37. Datagram • 二、客户端接收包的步骤如下: 1. 定义数据成员 int port; InetAddress address; DatagramSocket socket; DatagramPacket packet; byte[] sendBuf=new byte[256]; 2. 建立socket socket=new DatagramSocket();

  38. Datagram • 3.向服务器发出请求报文 • address=InetAddress.getByName(args[0]); • port=parseInt(args[1]); • packet=new • DatagramPacket(sendBuf,256,address,port); • socket.send(packet); • 这个包本身带有客户端的信息 • 4.客户机等待应答 • packet=new DatagramPacket(sendBuf,256); • socket.receive(packet);(如果没有到就一直等待,因此实用程序要设置时间限度)

  39. Datagram 5. 处理接收到的数据 String received=new String(packet.getData(),0); • System.out.println(received); • 数据报套接字首先是强调发送方和接收方的区别,同时也指出服务器和客户之间的不同: • 一个客户机必须事先知道服务器的地址和端口,以便进行出事连接 • 一个服务器从它接收到的数据报文中读取客户端的地址和端口.

  40. 小结 • 实现网络功能要靠URL类, URLConection类, Socket类和DatagramSocket类 • 网络上的数据传送是将网络连接转换成输入输出流 • DataInputStream和DataOutputStream (PrintStream)是网间流的载体. • URL适用于web应用,如访问http服务器是高层服务

  41. 小结 • 环回地址可用于在本地机器上调试网络程序 • Socket适用于面向连接的,可靠性要求高的应用 • Datagram适用于效率要求高的应用 • Socket是由IP和端口构成的一种网上通信链路的一端 • Socket通信要分别运行服务器和客户程序 • 服务器程序是多线程的,可处理多个客户的请求

  42. 作业 • 编写一个会话程序 • 要求: • 会话双方可以自由通话,看到对方发来“bye”则退出

More Related