Internet 协议集支持一个无连接的传输协议,该协议称为用户数据报协议(UDP,User Datagram Protocol)。UDP 为应用程序提供了一种无需建立连接就可以发送封装的 IP 数据包的方法。
发送
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
* 实现 UDP 协议的发送端:
* 实现封装数据的类 java.net.DatagramPacket 将你的数据包装
* 实现数据传输类 java.net.DatagramSocket 将数据包发出去
*
* 实现步骤:
* 1. 创建 DatagramPacket 对象,封装数据,接收的地址和端口
* 2. 创建 DatagramSocket 对象,
* 3. 调用 DatagramSocket 类的方法 send,发送数据包
* 4. 关闭资源
*
* DatagramPacket 构造方法:
* DatagramPacket(byte[] buf,int length,InetAddress address,int port)
*
* DatagramSocket 构造方法:
* DatagramSocket() 空参数
* 方法:send(DatagramPacket d)
*
*
*/
public class UDPSendTest {public static void main(String[] args) throws Exception {
// 创建发送端 Socket 对象
DatagramSocket ds = new DatagramSocket();
// 创建数据并打包
String s = "My name is happywindman";
byte[] bytes = s.getBytes();
int length = s.length();
InetAddress ip = InetAddress.getByName("127.0.0.1");// 根据自己主机的 ip 地址或者主机名
int port = 10086;
DatagramPacket dp = new DatagramPacket(bytes, length, ip, port);
// 发送数据
ds.send(dp);
// 释放资源
ds.close();}
}
接收
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
/*
* 实现 UDP 接收端
* 实现封装数据包 java.net.DatagramPacket 将数据接收
* 实现输出传输 java.net.DatagramSocket 接受数据包
*
* 实现步骤:
* 1. 创建 DatagramSocket 对象,绑定端口号
* 要和发送数据端口号一致
* 2. 创建字节数组,接受发来的数组
* 3. 创建数据包对象 DatagramPacket
* 4. 调用 DatagramSocket 对象方法 receive(DatagramPacket dp)
* 接受数据,数据放在数据包中
* 5. 拆包
* 发送的 IP 地址
* 数据包对象 DatagramPacket() 方法 getAddress() 获取的是发送端的 IP 地址对象
* 接受到的字节个数
* 数据包对象 DatagramPacket() 方法 getLength()
* 发送方的端口号
* 数据包对象 DatagramPacket() 方法 getPort()
* 6. 关闭资源
*/
public class UDPReceiveTest {public static void main(String[] args) throws Exception {
// 创建接收端 Socket 对象
DatagramSocket ds = new DatagramSocket(10086);
// 接收数据
byte[] bytes = new byte[1024];
int length = bytes.length;
DatagramPacket dp = new DatagramPacket(bytes, length);
ds.receive(dp);
// 解析数据 获取地址 带斜杠
InetAddress address = dp.getAddress();
// 获取发送端的 IP 地址对象
String ip = address.getHostAddress();
// 获取发送的端口号
int port = dp.getPort();
byte[] data = dp.getData();
int len = dp.getLength();
// 输出数据
// System.out.println(address);
System.out.println(String.format(" 发送方地址:%s:%s", ip, port));
System.out.println(new String(data, 0, len));
System.out.println(new String(bytes, 0, len));
ds.close();}
}