Android NIO 系列教程(七) -- ServerSocketChannel

Android NIO 系列教程(一) NIO概述
Android NIO 系列教程(二) – Channel
Android NIO 系列教程(三) – Buffer
Android NIO 系列教程(四) – Selector
Android NIO 系列教程(五) – FileChannel
Android NIO 系列教程(六) – SocketChannel
Android NIO 系列教程(七) – ServerSocketChannel
Android NIO 系列教程(八) --NIO简易聊天室
我们知道一个 tcp 的通信,除了 socket 还需要 serverSocket;所以,在学习了 SocketChannel 之后,我们来学习 ServerSocketChannel。

ServerSocketChannel 用于监听 tcp 连接的通道,就像 ServerSocket,如下理解:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress(9999));

while(true){
    SocketChannel socketChannel =
            serverSocketChannel.accept();

    //do something with socketChannel...
}

创建和关闭 ServerSocketChannel

可以通过 open() 方法创建:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

通过 close() 方法关闭:

ServerSocketChannel.close()

监听连接

通过 accept() 方法监听连接通道,它会返回一个以连接的 SocketChannel 的实例,accept() 是阻塞的,直到有其他 channel 连接上;而我们不紧紧满足得到一个连接,所以,我们应该这样写:

while(true){
    SocketChannel socketChannel =
            serverSocketChannel.accept();

    //do something with socketChannel...
}

当然,我们可以使用标志位来代替 这个 ture。

非阻塞模式

当然,ServerSocketChannel 也可以设置成非阻塞模式,当设置为非阻塞模式时,accept 不再是阻塞的,会立刻返回,如果当前没有连接,它会返回值为 null,所以,我们需要做一些判断:

ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();

serverSocketChannel.socket().bind(new InetSocketAddress(9999));
serverSocketChannel.configureBlocking(false);

while(true){
    SocketChannel socketChannel =
            serverSocketChannel.accept();

    if(socketChannel != null){
        //do something with socketChannel...
        }
}

后面我们根据这些已知知识,学习一下一个简单的多人聊天室。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值