因此,在21天里,我一直在学习Sam的“自学Java”,主题是“通过Internet进行通信”。在这一密集的章节中,它缺少的一件事是ServerSocketChannelServerSocket之间的关系。当我阅读以下内容时,这尤其令人困惑:

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);的示例中那样阻止

07-28 00:52