java nio服务器_Java NIO 服务器端简单实现例子

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

}

}

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值