UDP是面向无连接的、不需要确认双方是否存在,所以它是不可靠的协议。Java提供了一个类叫DatagramSocket来完成基于UDP协议的收发数据。使用DatagramSocket收发数据时,数据要以数据包的形式体现,一个数据包限制在64KB以内
UDP的使用
一发一接
客户端程序
public class Client {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket(7777);
byte[] bytes = "一二三abcde".getBytes();
DatagramPacket packet = new DatagramPacket(bytes, bytes.length
, InetAddress.getLocalHost(), 6666);
socket.send(packet);
System.out.println("客户端数据发送完毕");
socket.close(); // 释放资源
}
}
服务端程序
public class Server {
public static void main(String[] args) throws Exception {
System.out.println("服务端启动");
DatagramSocket socket = new DatagramSocket(6666);
byte[] buffer = new byte[1024 * 64]; // 64KB.
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
socket.receive(packet);
int len = packet.getLength();
String rs = new String(buffer, 0 , len);
System.out.println(rs);
System.out.println(packet.getAddress().getHostAddress());
System.out.println(packet.getPort());
socket.close(); // 释放资源
}
}
多发多收
客户端程序
public class Client {
public static void main(String[] args) throws Exception {
DatagramSocket socket = new DatagramSocket();
Scanner sc = new Scanner(System.in);
while (true) {
System.out.println("请说:");
String msg = sc.nextLine();
if("exit".equals(msg)){
System.out.println("退出成功!");
socket.close(); // 释放资源
break; // 跳出死循环
}
byte[] bytes = msg.getBytes();
DatagramPacket packet = new DatagramPacket(bytes, bytes.length
, InetAddress.getLocalHost(), 6666);
socket.send(packet);
}
}
}
服务端程序
public class Server {
public static void main(String[] args) throws Exception {
System.out.println("服务端启动");
DatagramSocket socket = new DatagramSocket(6666);
byte[] buffer = new byte[1024 * 64]; // 64KB.
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
while (true) {
socket.receive(packet);
int len = packet.getLength();
String rs = new String(buffer, 0 , len);
System.out.println(rs);
System.out.println(packet.getAddress().getHostAddress());
System.out.println(packet.getPort());
}
}
}