Java NIO 系列学习 10 - ServerSocketChannel
ServerSocketChannel 可以监听传入的TCP连接,与Java标准库的ServerSocket类似。
举个例子:
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
serverSocketChannel.socket().bind(new InetSocketAddress(9999));
while(true){
SocketChannel socketChannel = serverSocketChannel.accept();
//do something with socketChannel...
}
打开 ServerSocketChannel
通过调用ServerSocketChannel.open()
方法来打开ServerSocketChannel
ServerSocketChannel serverSocketChannel = ServerSocketChannel.open();
关闭 ServerSocketChannel
ServerSocketChannel.close()
监听 传入连接
通过调用ServerSocketChannel.accept()
方法来监听传入连接。当accept()
方法返回结果时,返回的是一个有传入连接的SocketChannel
,因此此方法是阻塞的,会一直阻塞直到有连接传入。
一般循环调用此方法:
while(true){
SocketChannel socketChannel = serverSocketChannel.accept();
// todo
}
别忘了跳出循环…
非阻塞模式
ServerSocketChannel
也是可以被置为非阻塞模式的。在非阻塞模式下,accept()
会立即返回,因此如果没有传入连接时可能返回null。所以需要检测是否返回的是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...
}
}
参考
- 原文作者:许杨淼淼
- 原文链接:/2019/05/16/java-nio-10/
- 版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可,非商业转载请注明出处(作者,原文链接),商业转载请联系作者获得授权。