@Test
public void client() throws IOException {
SocketChannel sChannel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 9898));
//切换非阻塞模式
sChannel.configureBlocking(false);
ByteBuffer buffer = ByteBuffer.allocate(1024);
//4.发送数据给服务器
buffer.put("zzzzz".getBytes());
buffer.flip();
sChannel.write(buffer);
sChannel.close();
}
@Test
public void server() throws IOException {
//1.获取通道
ServerSocketChannel ssChannel = ServerSocketChannel.open();
//2.切换非阻塞模式
ssChannel.configureBlocking(false);
//3.绑定连接
ssChannel.bind(new InetSocketAddress(9898));
//4. 获取选择器
Selector selector = Selector.open();
//5.将通道注册到选择器上,并且指定 监听接受时间
ssChannel.register(selector, SelectionKey.OP_ACCEPT);
///6.轮询式的获取选择器上已经'准备就绪'的事件
while (selector.select() > 0) {
//7. 获取当前选择器中所有注册的“选择键(已就绪的监听事件)”
Iterator<SelectionKey> it = selector.selectedKeys().iterator();
while (it.hasNext()) {
//8. 获取准备“就绪”的是事件
SelectionKey sk = it.next();
//9.判断具体是什么事件准备就绪
if (sk.isAcceptable()) {
//10. 若“接收就绪”,获取客户端连接
SocketChannel accept = ssChannel.accept();
//切换到非阻塞模式
accept.configureBlocking(false);
//将改通道注册到选择器
accept.register(selector, SelectionKey.OP_READ);
} else if (sk.isReadable()) {
//13. 获取当前选择器上“读就绪”状态的通道
SocketChannel channel = (SocketChannel) sk.channel();
//14.读取数据
ByteBuffer buffer = ByteBuffer.allocate(1024);
int len = 0;
while ((len = channel.read(buffer)) > 0) {
buffer.flip();
System.out.println(new String(buffer.array(), 0, len));
buffer.clear();
}
}
//15. 取消选择键 SelectionKey
it.remove();
}
}
}