简简单单网络NIO
博客专区 > ulpyuoo 的博客 > 博客详情
简简单单网络NIO
ulpyuoo 发表于3年前
简简单单网络NIO
  • 发表于 3年前
  • 阅读 8
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

摘要: 简明的,初级的 'NIO通信' 笔记

Socket通信模型简化下来很简单,主要有建立连接、维护连接、读、写。NIO作为基于事件模型实现,这些职责都以事件的形式表达,所以NIO关注的事件有:  

SelectionKey.OP_ACCEPT
SelectionKey.OP_CONNECT
SelectionKey.OP_READ
SelectionKey.OP_WRITE

每一个键表达了与之对应操作相关的一类事件。

要监听事件,则必须有注册监听与接收通知的地方,NIO的实现不同于平时见到的Listener模式,它是通过向Selector(轮询器)注册,通过遍历selector.selectedKeys()来获取事件通知。

注册:

serverChannel.register(selector, SelectionKey.OP_ACCEPT);

获取通知:

    while (true) {  
        //当注册的事件到达时,方法返回;否则,该方法会一直阻塞  
        selector.select();  
        // 获得selector中选中的项的迭代器,选中的项为注册的事件  
        Iterator ite = this.selector.selectedKeys().iterator();  
        while (ite.hasNext()) {  
            SelectionKey key = (SelectionKey) ite.next();  
            // do some thing
        }
    }

通过SelectionKey可以判断事件的类型,进行事件处理,也可以获取Channel进行读写数据。

那么selector怎么得来呢?见代码:

selector = Selector.open();

最初始用于注册监听的Channel:

服务端:

ServerSocketChannel serverChannel = ServerSocketChannel.open(); 
serverChannel.configureBlocking(false);
serverChannel.socket().bind(new InetSocketAddress(port));

客户端:

SocketChannel channel = SocketChannel.open();
channel.configureBlocking(false); 
channel.connect(new InetSocketAddress(ip,port));

大概的结构就介绍完了,网上找个例子好好看看吧。

  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 0
博文 4
码字总数 1951
×
ulpyuoo
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: