UDP
UDP发送数据
- Java中的UDP通信
- UDP协议是一种不可靠的网络协议,它在通信的两端各建立一个Socket对象,但是这两个Socket只是发送,接收数据的对象,因此对于基于UDP协议的通信双方而言,没有所谓的客户端和服务器的概念
- Java提供了DatagramSocket类作为基于UDP协议的Socket
构造方法
方法名 | 说明 |
---|---|
DatagramSocket() | 创建数据报套接字并将其绑定到本机地址上的任何可用端口 |
DatagramPacket(byte[] buf,int len,InetAddress add,int port) | 创建数据包,发送长度为len的数据包到指定主机的指定端口 |
代码演示
DatagramSocket datagramSocket = new DatagramSocket();
String s = "UDP客户端";
byte[] bytes = s.getBytes();
InetAddress name = InetAddress.getByName("1270.0.1");
int dk = 8888;
DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length,name,dk);
方法名 | 说明 |
---|---|
void send(DatagramPacket p) | 发送数据报包 |
void close() | 关闭数据报套接字 |
void receive(DatagramPacket p) | 从此套接字接受数据报包 |
代码演示
DatagramSocket datagramSocket = new DatagramSocket();
String s = "UDP客户端";
byte[] bytes = s.getBytes();
InetAddress name = InetAddress.getByName("1270.0.1");
int dk = 8888;
DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length,name,dk);
datagramSocket.send(datagramPacket);
datagramSocket.close();
void receive(DatagramPacket p) 从此套接字接受数据报包
DatagramSocket datagramSocket = new DatagramSocket(8888);
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length);
datagramSocket.receive(datagramPacket);
byte[] data = datagramPacket.getData();
int length = datagramPacket.getLength();
datagramSocket.close();
UDP接收数据【应用】
-
接收数据的步骤
- 创建接收端的Socket对象(DatagramSocket)
- 创建一个数据包,用于接收数据
- 调用DatagramSocket对象的方法接收数据
- 解析数据包,并把数据在控制台显示
- 关闭接收端
-
构造方法
方法名 说明 DatagramPacket(byte[] buf, int len) 创建一个DatagramPacket用于接收长度为len的数据包 -
相关方法
方法名 说明 byte[] getData() 返回数据缓冲区 int getLength() 返回要发送的数据的长度或接收的数据的长度
代码演示
DatagramSocket datagramSocket = new DatagramSocket(8888);
byte[] bytes = new byte[1024];
DatagramPacket datagramPacket = new DatagramPacket(bytes,bytes.length);
datagramSocket.receive(datagramPacket);
byte[] data = datagramPacket.getData();
int length = datagramPacket.getLength();
datagramSocket.close();
UDP三种通讯方式【理解】
-
单播
单播用于两个主机之间的端对端通信
-
组播
组播用于对一组特定的主机进行通信
-
广播
广播用于一个主机对整个局域网上所有主机上的数据通信
UDP组播实现【理解】
-
实现步骤
- 发送端
- 创建发送端的Socket对象(DatagramSocket)
- 创建数据,并把数据打包(DatagramPacket)
- 调用DatagramSocket对象的方法发送数据(在单播中,这里是发给指定IP的电脑但是在组播当中,这里是发给组播地址)
- 释放资源
- 接收端
- 创建接收端Socket对象(MulticastSocket)
- 创建一个箱子,用于接收数据
- 把当前计算机绑定一个组播地址
- 将数据接收到箱子中
- 解析数据包,并打印数据
- 释放资源
- 发送端
代码演示发送端
DatagramSocket ds = new DatagramSocket();
DatagramPacket dp = new DatagramPacket("UDP组播".getBytes(),"UDP组播".getBytes().length, InetAddress.getByName("224.0.1.0"),8888);
ds.send(dp);
ds.close();
代码演示接收端
MulticastSocket ms = new MulticastSocket();
DatagramPacket dp = new DatagramPacket(new byte[1024],1024);
ms.joinGroup(InetAddress.getByName("224.0.1.0"));
ms.receive(dp);
byte[] data = dp.getData();
int length = dp.getLength();
ms.close();
UDP广播实现
-
实现步骤
- 发送端
- 创建发送端Socket对象(DatagramSocket)
- 创建存储数据的箱子,将广播地址封装进去
- 发送数据
- 释放资源
- 接收端
- 创建接收端的Socket对象(DatagramSocket)
- 创建一个数据包,用于接收数据
- 调用DatagramSocket对象的方法接收数据
- 解析数据包,并把数据在控制台显示
- 关闭接收端
- 发送端
代码演示发送端
DatagramSocket ds = new DatagramSocket();
DatagramPacket dp = new DatagramPacket("广播UDP".getBytes(),"广播UDP".getBytes().length,InetAddress.getByName("255.255.255.255"),8888);
ds.send(dp);
ds.close();
代码演示接收端
DatagramSocket ds = new DatagramSocket(8888);
DatagramPacket dp = new DatagramPacket(new byte[1024],1024);
ds.receive(dp);
byte[] data = dp.getData();
int length = dp.getLength();
ds.close();