一、UDP简介
UDP是User Datagram Protocol的缩写。
即使是出现网络拥堵的情况下,UDP也无法进行流量控制等避免网络拥塞的行为。此外,传输途中即使出现丢包,UDP也不负责重发。甚至当出现包的到达顺序乱掉时也没有纠正的功能。
由于UDP面向无连接,它可以随时发送数据。再加上UDP本身的处理既简单又高效,因此经常用于以下几个方面:
1)包总量较少的通信(DNS、SNMP等)
2)视频、音频等多媒体通信(即时通信)
3)限定于LAN等特定网络中的应用通信
二、示例代码
使用UDP需要注意一下两点:
1)UDP是面向无连接的,client发送数据不会管server是否开启,也不关注是否成功失败。
2)server这边的receive方法会将接收到的数据存入bytebuffer,但如果数据报文超过buffer大小,多出来的数据会被默默抛弃。
服务端代码如下:
public class ServerTest {
public static void main(String[] args) {
// 开启UDP channel
try (DatagramChannel channel = DatagramChannel.open()) {
// 绑定端口
channel.socket().bind(new InetSocketAddress(9999));
System.out.println("waiting...");
ByteBuffer buffer = ByteBuffer.allocate(32);
// 接收消息,并写入buffer,此处方法阻塞
channel.receive(buffer);
// 切换buffer为读模式
buffer.flip();
System.out.println(print(buffer));
} catch (IOException e) {
e.printStackTrace();
}
}
static String print(ByteBuffer b) {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < b.limit(); i++) {
stringBuilder.append((char) b.get(i));
}
return stringBuilder.toString();
}
}
客户端代码:
public class ClientTest {
public static void main(String[] args) {
// 开启UDP channel
try (DatagramChannel channel = DatagramChannel.open()) {
// 初始化buffer,内容是hello
ByteBuffer buffer = StandardCharsets.UTF_8.encode("hello");
// 绑定服务端
InetSocketAddress address = new InetSocketAddress("localhost", 9999);
// 推送消息
channel.send(buffer, address);
} catch (Exception e) {
e.printStackTrace();
}
}
}
如上代码所示,其中客户端的recieve方法时阻塞的,直到接收到消息。
服务端结果输出如下所示:
waiting...
hello
即使客户端启动时,服务端没有启动,客户端也不会有任何异常。
关于UDP这里只做简单的介绍和使用方法,有用话,兄弟们点个赞~~
网友评论