首页 > 代码库 > java nio网络编程服务篇入门

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.close25         return;26     }27 }

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

java nio网络编程服务篇入门