最近需要继承一个udp服务,需求是这样的,服务端接收消息,并且支持多个udp端口。
例如:
客户端:port 11112
port 11113
port 11114
服务端:要可以同时监听这三个端口,接收发送的报文。
Select监听端口,然后获取请求数据
附代码
@Override
public void run(String... args) throws Exception {
//创建通道和选择器
Selector selector = Selector.open();
logger.info("==================udp服务端启动成功 ====================");
for (int i = 0; i < ports.length; i++) {
DatagramChannel datagramChannel = DatagramChannel.open();
//设置为非阻塞模式
datagramChannel.configureBlocking(false);
//创建data socket
DatagramSocket datagramSocket = datagramChannel.socket();
//绑定端口
datagramSocket.bind(new InetSocketAddress(ports[i]));
//将通道注册至selector
datagramChannel.register(selector, SelectionKey.OP_READ);
}
//接收客户端发送的数据
new Thread(() -> {
while (true) {
try {
while(selector.select()>0){
//获取选择器
Iterator<SelectionKey> iterator = selector.selectedKeys().iterator();
//遍历选择器
while (iterator.hasNext()) {
SelectionKey selectionKey = (SelectionKey) iterator.next();
if (selectionKey.isReadable()) {
//释放端口
iterator.remove();
//接收数据
doReceive(selectionKey);
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
}).start();
}
private void doReceive(SelectionKey selectionKey) throws InterruptedException {
// TODO Auto-generated method stub
String str = "";
DatagramChannel datagramChannel = (DatagramChannel) selectionKey.channel();
datagramChannel.getLocalAddress();
ByteBuffer buffer = ByteBuffer.allocate(1024);
SocketAddress socketAddress = datagramChannel.receive(buffer);
buffer.flip();
str = new String(buffer.array(),0,buffer.limit());
System.out.println(str);
buffer.clear();
}