应用: 在选择使用协议的时候,选择UDP必须要谨慎。在网络质量令人十分不满意的环境下,UDP协议数据包丢失会比较严重。但是由于UDP的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用UDP较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的ICQ和QQ就是使用的UDP协议。
java开发: java中的UDP实现分为两个类:DatagramPacket和 DatagramSocket。DatagramPacket类将数据字节填充到UDP包中,这称为数据报。 DatagramSocket来发送这个包。要接受数据,可以从DatagramSocket中接受一个 DatagramPack对象,然后从该包中读取数据的内容。
下面来一一说明udp服务器在java中的实现:
----创建数据接收码头,只接受和客户端约定的1080端口的数据
DatagramSocket ds=new DatagramSocket(1080);
----创建数据接收的数据缓冲区
DatagramPacket request = new DatagramPacket(new byte[1024], 1024);
----接受来自端口1024的数据包,并存储在集装箱datagramPacket中:注意一旦服务器开启,就会自动监听3000端口,如果 没有数据,则进行阻塞
ds.receive(dp);
----解析数据包中的信息
String data=new String(dp.getData(),0,dp.getLength());
----向客户端发送数据包
DatagramPacket response = new DatagramPacket(data, data.length, request.getAddress(), request.getPort());
socket.send(response);
服务器代码:
public class UDPService {
private final static int PORT = 1080
public static void main(String[] args) {
try (DatagramSocket socket = new DatagramSocket(PORT)) {
while (true) {
try {
DatagramPacket request = new DatagramPacket(new byte[1024], 1024);
socket.receive(request); //获取发送端dp
String daytime = new Date().toString(); //系统时间
byte[] data = daytime.getBytes("ASCII");
String data2=new String(request.getData(),0,request.getLength()); //拼接字符串, 发送值
DatagramPacket response = new DatagramPacket(data, data.length, request.getAddress(), request.getPort());
socket.send(response); //发送返回值
System.out.println("i get:"+daytime + " " + request.getAddress()+"data:"+data2);
if(data2.equals("hello"))
System.out.println("i'm full!!!!");
} catch (IOException e) {
e.printStackTrace();
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
客户端代码:
public class UDPClient {
public static void main(String[] args) throws Exception {
//数据包套接字:相当于码头,专门处理通信数据及进行数据转发设置的
DatagramSocket ds=new DatagramSocket();
String message="hello";
//数据报包:类似于集装箱,用来存储所有的数据信息
DatagramPacket dp=new DatagramPacket(
message.getBytes(), //数据都是已字节数据进行发送的,因此需要将数据进行转换
message.length(), //发送数据的长度
InetAddress.getByName("127.0.0.1"), //发送数据的源ip地址
1080 //发送数据的端口号
);
ds.send(dp); //数据包通过码头DatagramSocket发送出去
ds.close(); //数据发送之后关闭通道,减少资源浪费
System.out.println("发送成功, 等待回应! ");
}
}
测试: