java nio网络编程服务篇入门

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java nio网络编程服务篇入门相关的知识,希望对你有一定的参考价值。

概念就不说了。

要很多nio的开源框架,我用过mina,在两个项目中用过,主要处理数据的编解码。这块做好了,网络部分也就做完多半了。

现在再写网络编程,也不再使用框架了,直接使用java nio的api编写,快速、省事、灵活、自由。

当然如果对nio概念不熟悉,还是使用框架来的快,否则会有预想不到的问题。

主要说说java nio 需要注意的地方。

首先,建立网络监听

1 int port = 8080;
2 serverChannel = ServerSocketChannel.open( );
3 serverSocket = serverChannel.socket( );
4 selector = Selector.open( );
5 serverSocket.bind (new InetSocketAddress(port));
6 logger.info("start server listener for port : "+port);
7 serverChannel.configureBlocking (false);
8 serverChannel.register (selector, SelectionKey.OP_ACCEPT);

然后轮询处理select到的key

 1 while(running){
 2     try{
 3         selector.select();
 4         Iterator ite = selector.selectedKeys().iterator();
 5         while(ite.hasNext()){
 6             SelectionKey key = (SelectionKey) ite.next();
 7             ite.remove();
 8             acceptAndReadData(key);
 9         }
10     }
11     catch(Throwable t){
12         logger.error("accept connect or read data fail",t);
13     }
14 }

处理key的方法

 1 public void acceptAndReadData(SelectionKey key)
 2             throws IOException, ClosedChannelException {
 3     SocketChannel channel = null;
 4     // 判断操作类型
 5     if(key.isAcceptable()){
 6         // 接受客户端连接
 7         ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel();
 8         channel = serverChannel.accept();
 9         channel.configureBlocking(false);
10         SelectionKey channelKey = channel.register(selector, SelectionKey.OP_READ | SelectionKey.OP_WRITE);
11         return;
12     }
13 
14     channel = (SocketChannel) key.channel();
15     // 读取数据,且判断网络状态
16     try {
17         if(key.isReadable()){
18             logger.debug("--------- channel is reading !------------");
19         }else if(key.isWritable()){
20             logger.debug("--------- channel is writing !------------");
21     }
22     catch (Exception e){
23         key.cancel();
24         channel.close
25         return;
26     }
27 }

服务端完成,需要注意select模式主体是单线程的,所有所有耗时的处理都不能放到这个线程里面做。

以上是关于java nio网络编程服务篇入门的主要内容,如果未能解决你的问题,请参考以下文章

Java NIO6:选择器2---代码篇

Java NIO6:选择器2---代码篇

六.Netty入门到超神系列-Java NIO零拷贝实战

java入门篇12 --- IO操作

RPC高性能框架总结3.NIO示例代码编写和简析

Java入门系列-25-NIO(实现非阻塞网络通信)