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

86 lines
2.7 KiB
Java
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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);
}
}
}