java非阻塞模式简易实现
客户端
@Test
public void client() throws IOException {
//创建一个通道(客户端)
SocketChannel channel = SocketChannel.open(new InetSocketAddress("127.0.0.1", 9898));
//切换成非阻塞模式
channel.configureBlocking(false);
//分配制定大小的缓存区
ByteBuffer buffer = ByteBuffer.allocate(1024);
//发送数据
buffer.put(new Date().toString().getBytes());
//切换到读数据模式
buffer.flip();
//将缓冲区放到通道里
channel.write(buffer);
//清空缓冲区
buffer.clear();
//关闭通道
channel.close();
}
# 服务端实现代码
```java
//服务端
@Test
public void Server() throws IOException {
//1.获取通道(服务端通道)
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
//切换非阻塞模式
serverSocketChannel.configureBlocking(false);
//绑定连接
serverSocketChannel.bind(new InetSocketAddress(9898));
//获取选择器
Selector open = Selector.open();
//将通道注册到选择器上 ( 选择器,选择键4种)
//监控通道的状态情况 ,并指定监听事件
//准备就绪之后,就可以获取相应的socket连接
serverSocketChannel.register(open, SelectionKey.OP_ACCEPT);
//轮询式的获取选择器上已经准好就绪的事件
while (open.select() > 0) {
//获取当前选择器中所有注册的选择键((已就绪)
Iterator<SelectionKey> it = open.selectedKeys().iterator();
while (it.hasNext())
{ //获取准备就绪的事件
SelectionKey next = it.next();
//判断具体是什么事件准备就绪
if (next.isAcceptable())
{ //接收就绪 获取客户端连接
SocketChannel accept = serverSocketChannel.accept();
//切换非阻塞模式
accept.configureBlocking(false);
//将该通道注册到选择器上
accept.register(open,SelectionKey.OP_READ);
}
else if (next.isReadable())
{
//获取选择器读就绪状态的通道
SocketChannel channel = (SocketChannel) next.channel();
//读取数据
ByteBuffer buf = ByteBuffer.allocate(1024);
int len=0;
while ((len=channel.read(buf))>0)
{buf.flip();
byte[] array = buf.array();
System.out.println(new String(array, 0, len));
buf.clear();
}
}
}
//取消选择键
it.remove();
}
}
客户端代码
//服务端
@Test
public void Server() throws IOException {
//1.获取通道(服务端通道)
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
//切换非阻塞模式
serverSocketChannel.configureBlocking(false);
//绑定连接
serverSocketChannel.bind(new InetSocketAddress(9898));
//获取选择器
Selector open = Selector.open();
//将通道注册到选择器上 ( 选择器,选择键4种)
//监控通道的状态情况 ,并指定监听事件
//准备就绪之后,就可以获取相应的socket连接
serverSocketChannel.register(open, SelectionKey.OP_ACCEPT);
//轮询式的获取选择器上已经准好就绪的事件
while (open.select() > 0) {
//获取当前选择器中所有注册的选择键((已就绪)
Iterator<SelectionKey> it = open.selectedKeys().iterator();
while (it.hasNext())
{ //获取准备就绪的事件
SelectionKey next = it.next();
//判断具体是什么事件准备就绪
if (next.isAcceptable())
{ //接收就绪 获取客户端连接
SocketChannel accept = serverSocketChannel.accept();
//切换非阻塞模式
accept.configureBlocking(false);
//将该通道注册到选择器上
accept.register(open,SelectionKey.OP_READ);
}
else if (next.isReadable())
{
//获取选择器读就绪状态的通道
SocketChannel channel = (SocketChannel) next.channel();
//读取数据
ByteBuffer buf = ByteBuffer.allocate(1024);
int len=0;
while ((len=channel.read(buf))>0)
{buf.flip();
byte[] array = buf.array();
System.out.println(new String(array, 0, len));
buf.clear();
}
}
}
//取消选择键
it.remove();
}
}