【网络编程】4.UDP网络通信编程
1. DatagramSocket
1.1 基本介绍
UDP数据报通过数据报套接字DatagramSocket发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达。
1.2 类介绍
-
构造方法
- DatagramSocket(int port)
- port:监听的端口
- DatagramSocket(int port)
-
成员方法
- void send(DatagramPacket p)
- 发送数据报
- void receive(DatagramPacket p)
- 接收数据报
- void close()
- 关闭套接字
- void send(DatagramPacket p)
2. DatagramPacket
2.1 基本介绍
DatagramPacket对象封装了UDP数据报,在数据报中包含额发送端IP地址和端口号以及接收端的IP地址和端口号。UDP协议中每个数据报都给出了完整的地址信息,因此无需建立发送方和接收方的连接。UDP传送数据最大64K。
2.2 类介绍
- 构造方法
- DatagramPacket(byte[] buf, int length)
- 用于接收数据
- buf:接收数据的数组
- length:数组大小
- DatagramPacket(byte[] buf, int length, InetAddress address, int port)
- 用于发送数据
- buf:接收数据的数组
- length:数组大小
- address: 接收端地址
- port:接收端端口
- DatagramPacket(byte[] buf, int length)
- 成员方法
- byte[] getData()
- 获取数据
- int getLength()
- 获取数据长度
- byte[] getData()
3. 案例
在发送端通过控制台输入内容,接收端收到后,如果内容是“四大名著是哪些”则返回给接收端“四大名著是《红楼梦》、《西游记》、《三国演义》和《水浒传》”,如果是其他内容则返回给接收端“什么?”,发送端代码如下:
@Test
public void testSend() throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(8887);
Scanner scanner = new Scanner(System.in);
// 发送
byte[] data = scanner.next().getBytes();
DatagramPacket datagramPacket =
new DatagramPacket(data, data.length, InetAddress.getByName("127.0.0.1"), 8888);
datagramSocket.send(datagramPacket);
// 接收
data = new byte[64 * 1024];
datagramPacket = new DatagramPacket(data, data.length);
datagramSocket.receive(datagramPacket);
int length = datagramPacket.getLength();
System.out.println(new String(data, 0, length));
datagramSocket.close();
}
接收端代码如下:
@Test
public void testReceive() throws IOException {
DatagramSocket datagramSocket = new DatagramSocket(8888);
// 接收
byte[] data = new byte[64 * 1024];
DatagramPacket datagramPacket = new DatagramPacket(data, data.length);
datagramSocket.receive(datagramPacket);
int length = datagramPacket.getLength();
String s = new String(data, 0, length);
System.out.println(s);
// 发送
if ("四大名著是哪些".equals(s)) {
data = "四大名著是《红楼梦》、《西游记》、《三国演义》和《水浒传》".getBytes();
} else {
data = "什么?".getBytes();
}
datagramPacket = new DatagramPacket(data, data.length, InetAddress.getByName("127.0.0.1"), 8887);
datagramSocket.send(datagramPacket);
datagramSocket.close();
}
浙公网安备 33010602011771号