一、发送数据步骤:
1. 创建DatagramSocket对象,负责利用UDP协议往外发送数据(DatagramSocket中既有发送的方法,也有接收的方法)
2. 把数据打包(DatagramPacket)。把所有数据放到DatagramPacket当中
3. 发送数据
4. 释放资源
代码实现:
public static void main(String[] args) throws Exception {
// 1. 创建DatagramSocket对象
// 细节:创建DatagramSocket对象的时候,它还会去绑定对应的端口,以后我们就是通过这个端口往外发送数据。如果是空参构造,会在所有可用的端口中随机一个
DatagramSocket ds = new DatagramSocket();
// 2. 打包数据
String str = "你好啊";
byte[] bytes = str.getBytes();
InetAddress address = InetAddress.getByName("127.0.0.1");
int port = 10086;
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);
// 3. 发送数据
ds.send(dp);
// 4.释放资源
ds.close();
}
我DatagramSocket不是空参构造吗,它随机一个端口。那我后面为什么还要指定一个10086端口?
答:在上述代码中,虽然你使用了 DatagramSocket 的空参构造方法创建了一个 DatagramSocket 对象,但在创建 DatagramPacket 对象时,你指定了目标地址和端口号。这个端口号是目标主机(这里是 127.0.0.1)上等待接收数据的端口号,而不是发送数据的端口号。
即使 DatagramSocket 的构造方法随机选择了一个本地端口来发送数据,但在 DatagramPacket 中指定了目标地址和端口,这确保了数据将被发送到指定的目标地址和端口,而不是随机选择的端口。因此,即使你没有明确指定发送数据的端口号,你仍然需要指定接收数据的目标端口号,以确保数据被正确路由到目标主机上的正确端口。
------------------------------------------------------------------------------------------------
二、接收数据步骤:
1. 创建DatagramSocket对象,负责利用UDP协议接收数据(DatagramSocket中既有发送的方法,也有接收的方法)
2. 接收打包好的数据
3. 解析数据包
4. 释放资源
代码实现:
public static void main(String[] args) throws Exception {
// 1. 创建DatagramSocket对象
// 细节:在接收的时候,一定要绑定端口,而且绑定的端口一定要跟发送的端口保持一致
DatagramSocket ds = new DatagramSocket(10086);
// 2. 接收数据包
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
ds.receive(dp); // receive方法是阻塞的,就是程序执行到这一步的时候,它会在这里死等,等发送端发送消息
// 3. 解析数据包
byte[] data = dp.getData();
int length = dp.getLength();
InetAddress address = dp.getAddress();
int port = dp.getPort();
System.out.println("接收到数据" + new String(data, 0, length));
System.out.println("该数据是从" + address + "这台电脑中的" + port + "这个端口发出的");
// 4. 释放资源
ds.close();
}
标签:DatagramSocket,UDP,DatagramPacket,Java,端口,收发,端口号,发送数据,dp From: https://www.cnblogs.com/gagaya2/p/18105766