因此,在21天里,我一直在学习Sam的“自学Java”,主题是“通过Internet进行通信”。在这一密集的章节中,它缺少的一件事是ServerSocketChannel
和ServerSocket
之间的关系。当我阅读以下内容时,这尤其令人困惑:
ServerSocketChannel sockChannel = ServerSocketChannel.open();
sockChannel.configureBlocking(false);
InetSocketAddress server = new InetSocketAddress("localhost", 79);
ServerSocket socket = sockChannel.socket();
socket.bind(server);
...
在其余的代码中,永远不会使用该ServerSocket对象。
通过阅读Java的文档,我发现ServerSocketChannel在ServerSocket确实阻塞时监听连接时用于非阻塞目的。
所以问题是,为什么代码在使用
ServerSocketChannel
对象(非阻塞)创建ServerSocket
对象(阻塞)以绑定到地址时创建一个ServerSocketChannel
对象(非阻塞)?如果我只使用
bind()
的ServerSocket
而不是accept()
的将会有什么区别?同样的问题也适用于方法和两个类。
最佳答案
所以问题是为什么代码创建了ServerSocketChannel
对象(非阻塞)在使用该对象创建ServerSocket时
对象(阻塞)绑定到地址?
我想您的教程是在Java 1.7发布之前编写的。 ServerSocketChannel.bind()
是在Java 1.7版本中添加的。在此之前,您需要获取套接字以绑定地址。
如果我只是使用,那会有什么区别
ServerSocketChannel的bind()而不是ServerSocket的?
应该没有区别。
同样的问题也适用于accept()方法
类。
这是有区别的:ServerSocket.accept()
总是阻止,而ServerSocketChannel.accept()
可以配置为不像在sockChannel.configureBlocking(false);
的示例中那样阻止