简简单单网络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));

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

转载于:https://my.oschina.net/u/759974/blog/405089

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值