一、 参考资料
参考尚硅谷netty教程
https://www.bilibili.com/video/BV1DJ411m7NR?p=7&vd_source=4cd1b6f268e2a29a11bea5d2568836ee
二、 NIO(非阻塞)通信模型
package com.sht.test;
import java.net.InetSocketAddress;
import java.nio.ByteBuffer;
import java.nio.channels.SelectionKey;
import java.nio.channels.Selector;
import java.nio.channels.ServerSocketChannel;
import java.nio.channels.SocketChannel;
import java.util.Iterator;
import java.util.Set;
/**
* JAVA NIO模型
*
*/
public class App
{
public static void main( String[] args ) throws Exception
{
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
//得到一个selector对象
Selector selector = Selector.open();
//绑定端口
serverSocketChannel.socket().bind(new InetSocketAddress(6666));
//设置为非阻塞
serverSocketChannel.configureBlocking(false);
//将serverSocketChannel注册到selector
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
//循环等待客户连接
while(true)
{
//没有事件发生直接返回
if(selector.select(1000)== 0) {
continue;
}
//有事件发生则获取selectionKey集合
Set<SelectionKey> selectionKeys = selector.selectedKeys();
Iterator<SelectionKey> it = selectionKeys.iterator();
while(it.hasNext()){
SelectionKey key = it.next();
if(key.isAcceptable()) {
SocketChannel socketChannel = serverSocketChannel.accept();
if(socketChannel != null)
{
socketChannel.configureBlocking(false);
//将socketChannel注册到selector,同时绑定一个Buffer
socketChannel.register(selector, SelectionKey.OP_READ, ByteBuffer.allocate(1024));
}
} else if(key.isReadable()) {
SocketChannel socketChannel = (SocketChannel) key.channel();
ByteBuffer byteBuffer = (ByteBuffer) key.attachment();
socketChannel.read(byteBuffer);
String receiveStr = new String(byteBuffer.array());
System.out.println("收到数据:" + receiveStr);
byteBuffer.clear();
//将收到的数据再次发送给客户端
ByteBuffer writeBuffer = ByteBuffer.wrap(receiveStr.getBytes());
socketChannel.write(writeBuffer);
}
it.remove();
}
}
}
}