在ServerSocket和ServerSocketChannel中接受并绑定

时间:2014-10-20 05:23:52

标签: java sockets

所以我在21天的时间里一直在阅读Sam的“自学Java”,主题是“在互联网上进行通信”。在这个密集的章节中,它缺少的一件事是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阻塞时监听连接时用于非阻塞目的。

  1. 所以问题是为什么代码在创建ServerSocketChannel对象(阻塞)时会创建一个ServerSocket对象(非阻塞)来绑定到地址?

  2. 如果我只使用ServerSocketChannel的{​​{1}}代替bind(),会有什么不同?

  3. 同样的问题适用于ServerSocket方法以及两个类。

1 个答案:

答案 0 :(得分:3)

  

所以问题是为什么代码创建了ServerSocketChannel   对象(非阻塞),当它使用它来创建ServerSocket时   对象(阻塞)绑定到地址?

我的教程是在Java 1.7发布之前编写的。在java 1.7发行版中添加了ServerSocketChannel.bind()。在此之前,您需要让套接字绑定地址。

  

如果我刚刚使用,会有什么不同   ServerSocketChannel的bind()而不是ServerSocket的?

应该没有区别。

  

同样的问题同样适用于accept()方法   类。

这里有区别:ServerSocket.accept()总是阻止,而ServerSocketChannel.accept()可以配置为不阻止,就像您在sockChannel.configureBlocking(false);

示例中所做的那样