study/java/src/com/thinker/common/nio/NioServer.java

86 lines
2.7 KiB
Java
Raw Normal View History

2020-02-23 14:23:40 +00:00
package com.thinker.common.nio;
import java.io.IOException;
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;
/**
* nio nio different from bio nio
*
* */
public class NioServer{
private Selector selector;
/**
*
* @param port 监听端口
* 初始化服务器
*
* */
private NioServer init(int port) throws IOException{
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.configureBlocking(false);
serverSocketChannel.bind(new InetSocketAddress(port));
selector = Selector.open();
//将通道管理器与通道绑定并为该通道注册SelectionKey.OP_ACCEPT事件
//只有当该事件到达时Select.select()会返回,否则一直阻塞。
serverSocketChannel.register(selector, SelectionKey.OP_ACCEPT);
return this;
}
public void listen() throws IOException{
System.out.println("service starting.....");
while(true){
//当有注册事件到达时方法返回,否则阻塞
selector.select();
//获取selector中的迭代器选中项为注册的事件
Iterator<SelectionKey> ite = selector.selectedKeys().iterator();
while(ite.hasNext()){
SelectionKey key = ite.next();
//删除已选key防止重复处理
ite.remove();
//客户端连接事件
if(key.isAcceptable()){
ServerSocketChannel server = (ServerSocketChannel)key.channel();
//获取客户端连接通道
SocketChannel channel = server.accept();
channel.configureBlocking(false);
channel.write(ByteBuffer.wrap(new String("send to client").getBytes()));
channel.register(selector, SelectionKey.OP_READ);
System.out.println("client connect");
}else if(key.isReadable()){//有可读数据事件
//获取客户端传输数据可读消息通道。
SocketChannel channel = (SocketChannel)key.channel();
//创建读取数据缓存器
ByteBuffer buffer = ByteBuffer.allocate(1024);
int read = channel.read(buffer);
byte[] data = buffer.array();
String message = new String(data);
System.out.println("receive message from client, size:"+buffer.position()+"\tmessage:"+message);
try{
Thread.sleep(1000);
}catch(InterruptedException e){
e.printStackTrace();
break;
}
ByteBuffer out = ByteBuffer.wrap(new String("hello world").getBytes());
channel.write(out);
}
}
}
}
public static void main(String[] args) {
try{
new NioServer().init(1994).listen();
}catch(IOException e){
e.printStackTrace();
System.exit(0);
}
}
}