packagecom.heyang.biz.server.test.nio;importjava.net.InetSocketAddress;importjava.nio.ByteBuffer;importjava.nio.channels.SelectionKey;importjava.nio.channels.Selector;importjava.nio.channels.ServerSocketChannel;importjava.nio.channels.SocketChannel;importjava.nio.charset.Charset;importjava.util.Iterator;/*** NIO 服务器
* 说明:
* 作者:何杨(heyang78@gmail.com)
* 创建时间:2011-1-3 下午12:09:02
* 修改时间:2011-1-3 下午12:09:02*/publicclassNIOServer{//本地字符集privatestaticfinalString LocalCharsetName="gb2312";//本地服务器监听的端口privatestaticfinalintListenning_Port=8888;//缓冲区大小privatestaticfinalintBuffer_Size=1024;//超时时间,单位毫秒privatestaticfinalintTimeOut=3000;publicstaticvoidmain(String[] args)throwsException{//创建一个在本地端口进行监听的服务Socket信道.并设置为非阻塞方式ServerSocketChannel serverChannel=ServerSocketChannel.open();
serverChannel.socket().bind(newInetSocketAddress(Listenning_Port));
serverChannel.configureBlocking(false);//创建一个选择器并将serverChannel注册到它上面Selector selector=Selector.open();
serverChannel.register(selector, SelectionKey.OP_ACCEPT);while(true){//等待某个信道就绪if(selector.select(TimeOut)==0){
System.out.println(".");continue;
}//获得就绪信道的键迭代器IteratorkeyIter=selector.selectedKeys().iterator();//使用迭代器进行遍历就绪信道while(keyIter.hasNext()){
SelectionKey key=keyIter.next();//这种情况是有客户端连接过来,准备一个clientChannel与之通信if(key.isAcceptable()){
SocketChannel clientChannel=((ServerSocketChannel)key.channel()).accept();
clientChannel.configureBlocking(false);
clientChannel.register(key.selector(), SelectionKey.OP_READ,ByteBuffer.allocate(Buffer_Size));
}//客户端有写入时if(key.isReadable()){//获得与客户端通信的信道SocketChannel clientChannel=(SocketChannel)key.channel();//得到并重置缓冲区的主要索引值ByteBuffer buffer=(ByteBuffer)key.attachment();
buffer.clear();//读取信息获得读取的字节数longbytesRead=clientChannel.read(buffer);if(bytesRead==-1){//没有读取到内容的情况clientChannel.close();
}else{//将缓冲区准备为数据传出状态buffer.flip();//将获得字节字符串(使用Charset进行解码)String receivedString=Charset.forName(LocalCharsetName).newDecoder().decode(buffer).toString();//控制台打印出来System.out.println("接收到信息:"+receivedString);//准备发送的文本String sendString="你好,客户端. 已经收到你的信息"+receivedString;//将要发送的字符串编码(使用Charset进行编码)后再进行包装buffer=ByteBuffer.wrap(sendString.getBytes(LocalCharsetName));//发送回去clientChannel.write(buffer);//设置为下一次读取或是写入做准备key.interestOps(SelectionKey.OP_READ|SelectionKey.OP_WRITE);
}
}
keyIter.remove();
}
}
}
}