标签:
概念就不说了。
要很多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模式主体是单线程的,所有所有耗时的处理都不能放到这个线程里面做。
标签:
原文地址:http://www.cnblogs.com/sunzuoquan/p/5852645.html