首页 > 代码库 > 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网络编程服务篇入门
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。