第4章 Socket API
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
4.3.3 面向连接数据包Socket API
• 接下来学习如何在面向连接通信中使用
Socket,很少使用数据包Socket实现面向连接通 信;因为API提供的连接非常简单,通常不能满足 应用要求。流式Socket是面向连接通信中更典型 和更适用的方法,本章4.4介绍。
• 表4.3描述了类DatagramSocket中用于创建 和终止连接的两个方法。Socket连接通过指定 远程Socket地址建立。一旦连接建立后, Socket 被专门用来与远程Socket交换数据报文。
3. 无连接方式的异常情况
双工通信方式实例(Example2)
• 在Example1中,采用单工方式,而在图4.10、图4.11和 图4.12中采用全双工方式的实现方法。 • 在图4.10的代码模块中,类MyDatagramSocket作为 DatagramSocket(第9行)的子类被创建,其中有两个实 例方法被分别用来发送和接收消息。 • 程序Example2SenderReciever(图4.11中的第9行)实例 化一个MyDatagramSocket对象,然后调用自身的 SendMessage方法。随后又调用RecievMessage方法。 • 程序Example2SenderReciever(图4.12)实例化一个 MyDatagramSocket对象,然后调用RecievMessage方法, 接着调用SendMessage方法。
服务器
receive
客户
请求
send
receive
send
响应
阻塞状态 非阻塞状态
图4.7 无连接Socket的事件同步
• 影印版P105和P106的图4.8及图4.9所示是两个程 序利用数据包Socket交换单个数据串的程序代码。 该程序将程序逻辑设计得尽可能简单,以便突出强 调进程间通信的基本语法。图4.8所示是发送者 Java实例;图4.9所示是接收者Java实例。 • 注意:发送者创建的数据报文包含目标地址(见图 4.8的第31到33行),而接收者数据报文不含携带 目标地址(见图4.9的第31和32行)。另外,发送 者Socket未指定端口(见图4.8的第28行),而接 收者Socket与特定端口绑定(见图4.9的第28行), 以便发送者可以在其数据包中将该端口(见图4.8 的第33行)作为目标地址定义。
• 在无连接方式中,数据是通过一系列独立的 报文发送的,因此,无连接数据包Socket 中存在异常情况: • 1)如果数据包被发送给一个仍未被接收者 创建的Socket,该数据包将可能被丢弃。 也就是说,数据包不会被IPC设施保存。 • 2)如果接收者定义了一个大小为n的数据 包缓存,那么大小超过n的接收消息将被截 断。例如:定义n=10字节。当发送11字节 时,就有1字节被截断。
4.3.2 数据包Socket中的事件同步
• 1. 在基本Socket API中,无论是面向连接还是无 连接方式,send操作都是非组塞nonblocking)的, 而receive操作是阻塞的(blocking)。为避免无 限期阻塞情况的发生,接收进程可以使用 setSoTimeout方法设置一定时段的超时间隔,如 50秒等。如果超时间隔结束,仍没有收到数据, 就引发一个Java异常处理,该异常可在代码中被 捕获,以便准确的处理异常情形。 • 图4.7是一个事件状态图,它显示了使用数据包 Socket的请求-应答协议的会话过程。
构造一个数据包Socket,并绑定到本地主机上的指 定端口;该端口随后可在数据包报文中用来定义 传输到该Socket的数据。 关闭当前datagramSocket对象 使用该Socket接收数据 使用该Socket发送数据 以毫秒为单位设置timeout,用于组塞该 Socket发起的receive操作。
• 4.在接收者进程中,datagram Socket对象也 必须被实例化并绑定到一个本地端口上;该 端口必须与发送者数据包的定义一致。为接 收发送给Socket的数据包,接收进程创建一 个指向字节数组的datagram Packet,并调用 datagram Socket对象的receive方法;将 datagram Packet对象指针作为参数定义。 • 图4.3解释了两个进程的程序所使用到的数据 结构。图4.4解释了两个进程的程序流。
表4.3 面向连接数据包Socket的方法调用
方法/构造函数
Void connect(InetAddress address,int port)
描
述
在当前Socket和远程地址极 其端口之间创建逻辑连接。 如果在当前Socket存在连接,终止该连接
• TCP是面向连接的协议,由于有连接,从 发送者到接收者的数据能保证以发送次序 相同的顺序被接收。 • Java工具:Java Socket API以及所有其 他Socket API中,都提供了基于UDP或TCP 协议的Socket编程构造。使用UDP传输的 Socket称为数据包Socket(datagram Sockets);而采用TCP的Socket称为流式 Socket(stream Socket)。
• 发送与接收者程序流:
发送者程序
Create a datagram socket and bind it to any local port; Place data in a byte array; Create a datagram socket,specifying The data array and the receiver´s Address; Invoke the send method of the Socket with a reference to the Datagam packet.
4.2 IPC中的Socket隐喻
• Socket API是借用的电话术语,设计者提 供了一种称为Socket的编程构造。希望与 另一进程通信的进程必须创建该构造的一 个实例,如图4.1所示。
进程A 进程B
一个socket
图4.1 Socket API概念模型
4.3 数据包Socket API
• 在Internet网络协议的体系结构中,传输 层上有两种主要的协议:UDP和TCP。 • UDP(用户数据报协议):在传输层发送和 接收,允许使用无连接通信传送报文。被传 输的报文称数据包。根据无连接通信协议, 每个传输的数据包都被分别解析和路由。并 且可按任何顺序到达接收者。 • 包指在网络上传输的数据单位,每个包中都 含有效数据(载荷,Payload)以及一些控 制信息。如目的地址等。
SΒιβλιοθήκη Baiducket API 运行时支持
传输层软件 面向连接数据包Socket
传输层软件
• • • •
1. Java为数据包Socket API提供两个类: (1)针对Socket的datagramSocket类 (2)针对数据包交换的datagram Packet类 2.希望使用该API发送和接收数据的进程须 实例化一个datagram Socket对象,或简称 为Socke对象。每个Socke被绑定到该进程所 在机器的某个UDP端口上。 • 3.要求读者养成联及查阅Java API文档 • http:/java.sun.com/ • 以便了解每个java类的最新定义、方法或构 造函数的准确性。
4.3.1 无连接数据包
• 数据包Socket在应用层可以支持无连接通 信及面向连接通信。如图4.2所示。
Socket API 运行时支持 进程A 进程B Socket API 运行时支持
传输层软件
传输层软件
图4.2 两种结构比较
Socket API 运行时支持 进程A
无连接数据包Socket
进程B
2.实例(Example 1)
阅读程序说明:
• • • • • • • • 符号的意义: 单行注释以“//”开始 多行注释以“/*”开始,以“*/”结束 文档注释以“@”开始, 类一般在“{…}”之内 例: 1 import java.net.*;(Java网络服务类) 2 import java.io.*;(Java I/O socket)
第4章 Socket API
• 4.1 背 景
• Socket API最早作为Berkeley Unix操作系统的程 序库,出现于20世纪80年代,用于提供IPC功能。 现在所有主流操作系统都支持Socket API。在BSD、 Linux等基于Unix的系统中, Socket API都是操作 系统内核的一部分。在个人计算机操作系统如: MS-DOS、Windows NT(各种变形版本)中, Socket API都以程序库的形式提供的。 • 在Windows系统中, Socket API称为Winsock。 • Java语言在设计之初,就考虑到了网络编程,也将 Socket API作为语言核心类的一部分提供给用户。
进程B 进程A
A接收的顺序: A先接收B的m1; 然后接收C的m2 接着接收B的m3 B4;之后再接收 C的m5…
进程A可 以分别建 立进程B 进程C的 Socket 各次独立 接收。
进程B 进程A
进程C
一个无连接数据包Socket
进程C
(a)
图4.5无连接数据包Socket
(b)
• 6. 表4.1总结了类datagram Packet的主要 方法和构造函数;表4.2概括了类datagram socket的主要方法和构造函数;图4.6所示 是使用数据包socket通信的一对程序之间的 基本语法(影印版P103)。
表4.1 类datagram Packet的主要方法和构造函数 方法/构造函数 描 述
为长度Length的接收报文构造一个数据 datagramPacket(byte[]buf,in length) 包报文;接收到的被存储到由Buf引导 的字节数组中。 datagramPacket(byte[]buf,in length, 为长度Length的发送报文构造一个绑定 到指定主机端口的Socket的数据包报文 InetAddress address,int port)(注意: 接收到的数据被存储到由Buf引导的字节 类InetAddress表示一个IP地址) 数组中。 构造一个数据包Socket,并绑定到本地主 机上任一可用端口;该构造函数可用于 datagramSocket() 只发送数据而不必接收数据的进程。
• 发送者和接收者程序中的数据结构:
发送者程序 一个字节数组 接收者程序 一个字节数组
接收者地址
一个DatagramPacket对象 一个DatagramPacket对象
send
一个DatagramSocket对象
对象引用 数据流
receive
一个DatagramSocket对象
图4.3发送者和接收者程序中的数据结构
Invoke the receive method of the Socket with a reference to the Datagram packet
图4.4 发送者和接收者程序流
• 5. 图4.5所示是无连接数据包Socket,绑 定到进程的Socket可用来向不同目的地发 送报文。多个进程也可以同时向绑定到某个 接收进程的Socket发送数据包,在这种情 况下,将无法预测消息到达的顺序,这一点 与底层UDP协议一致。
接收者程序
Create a datagram socket and bind it to a specific local port; Create a byte array for receiving the Data;
Create a datagram packet,specifying The data array;
表4.2 类datagram Socket的主要方法和构造函数
表4.1 类datagram Socket的主要方法和构造函数 方法/构造函数 datagramSocket(int Port) Void close() Void receive(datagramPacket P) Void Send(datagramPacket P) Void setSOTimeout(int timeout) 描 述