利用DatagramChannel 实现非阻塞的数据报发送接收
package com.mock;
import org.junit.jupiter.api.Test;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.DatagramChannel;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.util.Iterator;
import java.util.Scanner;
import java.util.Set;
public class TestDatagramChannel {
@Test
public void client() throws IOException {
//打开客户端通道
DatagramChannel client = DatagramChannel.open();
client.configureBlocking(false);
ByteBuffer b = ByteBuffer.allocate(1024);
Scanner scanner = new Scanner(System.in);
while (scanner.hasNext()) {
String s = scanner.next();
b.put(s.getBytes());
b.flip();
//发送数据到服务端
client.send(b, new InetSocketAddress("127.0.0.1", 8080));
b.clear();
}
client.close();
}
@Test
public void server() throws IOException {
DatagramChannel server = DatagramChannel.open();
server.configureBlocking(false);
//监听
server.bind(new InetSocketAddress(8080));
Selector selector = Selector.open();
//注册读事件
server.register(selector, SelectionKey.OP_READ);
while (selector.select() > 0) {
Set<SelectionKey> selectionKeys = selector.selectedKeys();
Iterator<SelectionKey> iterator = selectionKeys.iterator();
while (iterator.hasNext()) {
SelectionKey selectionKey = iterator.next();
if (selectionKey.isReadable()) {
ByteBuffer byteBuffer = ByteBuffer.allocate(1024);
//收取客户端发送的消息
server.receive(byteBuffer);
byteBuffer.flip();
System.out.println("接收到客户端数据: " + new String(byteBuffer.array(), 0, byteBuffer.limit()));
byteBuffer.clear();
}
iterator.remove();
}
}
}
}