码迷,mamicode.com
首页 > 编程语言 > 详细

java nio网络编程服务篇入门

时间:2016-09-08 14:21:13      阅读:109      评论:0      收藏:0      [点我收藏+]

标签:

概念就不说了。

要很多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网络编程服务篇入门

标签:

原文地址:http://www.cnblogs.com/sunzuoquan/p/5852645.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!