概念
Socket套接字,是由系统提供用于网络通信的技术,是基于TCP/IP协议的网络通信的基本操作单元.
基于Socket套接字的网络程序开发就是网络编程.
数据报套接字
使用的是UDP(User Datagram Protocol)协议,传输层协议.
- 无连接
- 不可靠传输
- 面向数据报
- 全双工
对于UDP协议来说,具有无连接,面向数据报的特征,每次都是没有建立连接,并且一次性发送全部数据报,并一次性接收全部数据报.
java使用UDP协议通信,基于DatagramSocket类创建数据报套接字,并使用DatagramPacket作为发送或接收的UDP数据报.
DatagramSocket
DatagramSocket是UDP Socket,用于发送和接收UDP数据报.
DatagramSocket构造方法:
方法签名 | 方法说明 |
---|---|
DatagramSocket() | 创建一个UDP数据报套接字的Socket,绑定到本机任意一个随机端口(一般用于客户端) |
DatagramSocket(int port) | 创建一个UDP数据报套接字的Socket,绑定到指定端口(一般用于服务器端) |
DatagramSocket方法:
方法签名 | 方法说明 |
---|---|
void receive(DatagramSocket p) | 就收套接字数据报,没有则会阻塞等待 |
void send(DatagramSocket p) | 发送套接字数据报 |
void close() | 关闭数据报套接字 |
DatagramPacket
DatagramPacket是UDP Socket发送和接受的数据报
DatagramPacket构造方法:
方法签名 | 方法说明 |
---|---|
DatagramPacket(byte[] buf, int length) | 这是接收数据报,接收的数据保存在byte数组中,指定接收长度 |
DatagramPacket(byte[] buf, int offset, int length, SocketAddress address) | 这是发送数据报,发送的数据时字节数组,从0到指定长度,address指定目的主机的IP和端口号 |
DatagramPacket方法:
方法签名 | 方法说明 |
---|---|
InetAddress getAddress() | 从接受的数据报中,获取发送端主机IP地址.或者从发送的数据报中,获取接收端主机的IP地址 |
int getPort() | 从接受的数据报中,获取发送端主机的端口号.或者从发送的数据报中,获取接收端主机的端口号 |
byte[] getData() | 获取数据报中的数据 |
InetSocketAddress
InetSocketAddress(SocketAddress的子类) 构造方法:
方法签名 | 方法说明 |
---|---|
InetSocketAddress(InetAddress addr, int port) | 创建一个Socket地址,包含IP地址和端口号 |
下面写一个回显服务器案例供参考:
// 服务器
public class UdpEchoServer {
private DatagramSocket socket = null;
public UdpEchoServer(int port) throws SocketException {
// 根据端口号构造, 端口号被占用的时候,会报错
socket = new DatagramSocket(port);
}
public void start() throws IOException