服务端:
//新建NIO通道
ServerSocketChannel server = ServerSocketChannel.open();
//使通道为非阻塞
server.configureBlocking(false);
//创建基于NIO通道的socket连接
ServerSocket ss = server.socket();
//新建socket通道的端口
ss.bind(new InetSocketAddress(9000));
//将NIO通道绑定到选择器
Selector selector = Selector.open();
server.register(selector, SelectionKey.OP_ACCEPT);
System.out.println("--------开始监听-----------");
while (true) {
//获取通道内是否有选择器的关心事件
int num = selector.select();
//如果小于1,停止此次循环,进行下一个循环
if (num < 1) {
continue;
}
//获取通道内关心事件的集合
Set selectedKeys = selector.selectedKeys();
Iterator iterator = selectedKeys.iterator();
while (iterator.hasNext()) {
SelectionKey key = (SelectionKey) iterator.next();
//移走此次事件
iterator.remove();
if (key.isAcceptable()) {
//获取对应的SocketChannel
SocketChannel client = server.accept();
System.out.println("Accepted connection from " + client);
//使此通道为非阻塞
client.configureBlocking(false);
//在此通道上注册事件
client.register(key.selector(), SelectionKey.OP_WRITE);
} else if (key.isWritable()) {
//获取此通道的SocketChannel
SocketChannel client = (SocketChannel) key.channel();
//将数组data的大小定义为ByteBuffer缓冲区的大小
ByteBuffer source = ByteBuffer.wrap(new byte[] { 12, 12, 12 });
client.write(source);
// 改变关注状态
key.interestOps(SelectionKey.OP_READ);
// client.register(selector,
// SelectionKey.OP_READ);
// client.close();
} else if (key.isReadable()) {
SocketChannel channel = (SocketChannel) key.channel();
// 得到附件,就是上面SocketChannel进行register的时候的第三个参数,可为随意Object
//ByteBuffer buffer = (ByteBuffer) key.attachment();
ByteBuffer buffer = ByteBuffer.allocate(10);
// 读数据 这里就简单写一下,实际上应该还是循环读取到读不出来为止的
channel.read(buffer);
// 改变自身关注事件,可以用位或操作|组合时间
//key.interestOps(SelectionKey.OP_WRITE);
System.out.println(buffer.toString());
channel.close();
}
}
}
客户端:
//建立到服务端的链接
SocketAddress address = new InetSocketAddress("127.0.0.1", 9000);
//创建管道socket
SocketChannel client = SocketChannel.open();
client.configureBlocking(false);//设置为非阻塞状态
//注册监听事件
Selector selector = Selector.open();
client.register(selector, SelectionKey.OP_CONNECT);
//连接服务器
client.connect(address);
while(true)
{
int re= selector.select();//等待注册的事件
if(re<1)
continue;
Iterator iterator = selector.keys().iterator();//获取注册的事件集合
while(iterator.hasNext())
{
SelectionKey selectionKey = (SelectionKey) iterator.next();
if(selectionKey.isConnectable())
{
if(client.finishConnect())
{
System.out.println("-----连接成功----");
SocketChannel channel = (SocketChannel) selectionKey.channel();
channel.register(selectionKey.selector(), SelectionKey.OP_READ);
}
// selectionKey.interestOps(SelectionKey.OP_READ);
}
else if(selectionKey.isReadable())
{
SocketChannel channel = (SocketChannel) selectionKey.channel();
//创建静态的缓冲区
ByteBuffer buffer = ByteBuffer.allocate(10);
//读取数据,到buffer中
channel.read(buffer);
System.out.println("---------"+"客户端收到消息"+buffer.toString()+"--------");
selectionKey.interestOps(SelectionKey.OP_WRITE);
}
else if(selectionKey.isWritable())
{
SocketChannel channel = (SocketChannel) selectionKey.channel();
ByteBuffer buffer = ByteBuffer.wrap(new byte[]{12,123});
channel.write(buffer);
System.out.println("---------"+"客户端发送消息"+buffer.toString()+"--------");
channel.close();
}
// iterator.remove();//移除当前处理事件
}
}