一个UDP通信案例
需要的依赖
<dependency>
<groupId>cn.hutool</groupId>
<artifactId>hutool-all</artifactId>
<version>5.7.8</version>
</dependency>
UDP服务器端案例
package cn.demo.udp;
import cn.hutool.cache.CacheUtil;
import cn.hutool.cache.impl.TimedCache;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Console;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
import java.util.Timer;
import java.util.TimerTask;
public class UdpServerTest {
private static final TimedCache<String, String> timedCache = CacheUtil.newTimedCache(2000);
public static void main(String[] args) throws IOException {
timedCache.schedulePrune(5000);
Timer timer = new Timer();
timer.schedule(new TimerTask() {
@Override
public void run() {
Console.log("[{}]------当前可能在线的udp-client-----start--", DateUtil.now());
if (timedCache.keySet().size() > 0) {
for (String s : timedCache.keySet()) {
Console.log("------" + s);
}
}
Console.log("[{}]--------------------------------end--", DateUtil.now());
}
}, 1000, 4000);
DatagramSocket socket = new DatagramSocket(7788);
byte[] buffer = new byte[1024 * 64];
DatagramPacket packet = new DatagramPacket(buffer, buffer.length);
while (true) {
socket.receive(packet);
int length = packet.getLength();
String recStr = new String(buffer, 0, length);
String ip = packet.getAddress().getHostAddress();
int port = packet.getPort();
String netAddr = ip + ":" + port;
timedCache.put(netAddr, "udp-cli");
Console.log("[{}] rec-from:{},msg:{}", DateUtil.now(), netAddr, recStr);
if ("aaa".equals(recStr)) {
byte[] sendBytes = "bbb!".getBytes();
socket.send(new DatagramPacket(sendBytes,
sendBytes.length,
packet.getAddress(),
port));
} else if ("exit".equals(recStr)) {
byte[] sendBytes = "ok!".getBytes();
socket.send(new DatagramPacket(sendBytes,
sendBytes.length,
packet.getAddress(),
port));
Console.log("[{}] {}要主动下线...", DateUtil.now(), netAddr);
timedCache.remove(netAddr);
} else {
byte[] sendBytes = "not-correct-req-data!!!".getBytes();
socket.send(new DatagramPacket(sendBytes,
sendBytes.length,
packet.getAddress(),
port));
}
}
}
}
UDP客户端案例
package cn.demo.udp;
import cn.hutool.core.date.DateUtil;
import cn.hutool.core.lang.Console;
import java.io.IOException;
import java.net.*;
import java.util.Scanner;
public class UdpClientTest {
public static void main(String[] args) throws IOException {
DatagramSocket socket = new DatagramSocket();
Scanner sc = new Scanner(System.in);
while (true){
System.out.println("请输入要发送的消息:");
String input = sc.nextLine();
byte[] bytes = input.getBytes();
DatagramPacket packet = new DatagramPacket(bytes, bytes.length,
InetAddress.getLocalHost(), 7788);
socket.send(packet);
if ("exit".equals(input)){
System.out.println("udp cli主动下线...");
socket.close();
break;
}
byte[] buffer = new byte[1024 * 64];
DatagramPacket packetServerRec = new DatagramPacket(buffer, buffer.length);
socket.receive(packetServerRec);
int length = packetServerRec.getLength();
String recStr = new String(buffer, 0, length);
String ip = packetServerRec.getAddress().getHostAddress();
int port = packetServerRec.getPort();
String netAddr = ip + ":" + port;
Console.log("[{}] rec-from-udp-server:{},msg:{}", DateUtil.now(), netAddr, recStr);
}
}
}