JAVA-网络编程-UDP通信 DatagramPacket类和DatagramSocket类
DatagramPacket类
- 数据报包用来实现无连接包投递服务。每条报文仅根据该包中包含的信息从一台机器路由到另一台机器。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。不对包投递做出保证。
构造方法
构造方法
| 方法 |
说明 |
DatagramPacket(byte[] buf, int length) |
构造 DatagramPacket,用来接收长度为 length 的数据包 |
DatagramPacket(byte[] buf, int length, InetAddress address, int port) |
构造数据报包,用来将长度为 length 的包发送到指定主机上的指定端口号 |
方法
| 返回值类型 |
方法 |
说明 |
InetAddress |
getAddress() |
返回某台机器的 IP 地址,此数据报将要发往该机器或者是从该机器接收到的 |
byte[] |
getData() |
返回数据缓冲区 |
int |
getLength() |
返回将要发送或接收到的数据的长度 |
int |
getPort() |
返回某台远程主机的端口号,此数据报将要发往该主机或者是从该主机接收到的 |
DatagramSocket类
- 数据报套接字是包投递服务的发送或接收点。每个在数据报套接字上发送或接收的包都是单独编址和路由的。从一台机器发送到另一台机器的多个包可能选择不同的路由,也可能按不同的顺序到达。
- 在 DatagramSocket 上总是启用 UDP 广播发送。为了接收广播包,应该将 DatagramSocket 绑定到通配符地址。在某些实现中,将 DatagramSocket绑定到一个更加具体的地址时广播包也可以被接收。
构造方法
| 方法 |
说明 |
DatagramSocket() |
构造数据报套接字并将其绑定到本地主机上任何可用的端口 |
DatagramSocket(int port) |
创建数据报套接字并将其绑定到本地主机上的指定端口 |
方法
| 返回值类型 |
方法 |
说明 |
void |
receive(DatagramPacket p) |
从此套接字接收数据报包 |
void |
send(DatagramPacket p) |
从此套接字发送数据报包 |
代码
发送数据包类
public class UDPsend2 {
public static void main(String[] args) throws IOException {
// 输入信息并发送
Scanner sc = new Scanner(System.in);
while (true) {
// 数据
byte[] bytes = sc.next().getBytes();
// 数据包
InetAddress inet = InetAddress.getByName("127.0.0.1");
DatagramPacket dp = new DatagramPacket(bytes, bytes.length, inet, 7888);
// 发送平台
DatagramSocket ds = new DatagramSocket();
// 发送
ds.send(dp);
}
// while(true) 永远不会轮到释放资源代码
// replace
ds.close();
}
}
接收数据包类
public class UDPrecieve2 {
public static void main(String[] args) throws IOException {
// 接收平台
DatagramSocket ds = new DatagramSocket(7888);
// 数据包
byte[] bytes = new byte[1024];
DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
while (true) {
// 接收
ds.receive(dp);
// 解包输出
InetAddress inet = dp.getAddress();
int port = dp.getPort();
int len = dp.getLength();
String str = new String(bytes, 0, len);
System.out.println("ip:"+inet.getHostAddress()+",port:"+port+",str:"+str);
}
}
}
思路:
发送数据时,先将数据、数据大小、对方主机名、端口号装入DatagramPacket实例中,然后用DatagramSocket发送出去。因为采用UDP协议无连接,报文自己去找收件地址,所以DatagramSocket只需要发送。
接收数据时,要先使用DatagramSocket带上端口号来进行接收UDP广播,接收到之后用DatagramPacket接收放入缓冲区(数组),再解包输出就可以了。