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...
}
}
后面我们根据这些已知知识,学习一下一个简单的多人聊天室。