所以我在21天的时间里一直在阅读Sam的“自学Java”,主题是“在互联网上进行通信”。在这个密集的章节中,它缺少的一件事是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
的{{1}}代替bind()
,会有什么不同?
同样的问题适用于ServerSocket
方法以及两个类。
答案 0 :(得分:3)
所以问题是为什么代码创建了ServerSocketChannel 对象(非阻塞),当它使用它来创建ServerSocket时 对象(阻塞)绑定到地址?
我的教程是在Java 1.7发布之前编写的。在java 1.7发行版中添加了ServerSocketChannel.bind()
。在此之前,您需要让套接字绑定地址。
如果我刚刚使用,会有什么不同 ServerSocketChannel的bind()而不是ServerSocket的?
应该没有区别。
同样的问题同样适用于accept()方法 类。
这里有区别:ServerSocket.accept()
总是阻止,而ServerSocketChannel.accept()
可以配置为不阻止,就像您在sockChannel.configureBlocking(false);