为什么我们必须创建InetSocketAddress
的对象?
但对于ServerSocket
,我们只需使用int
输入端口号
示例:
try(
ServerSocketChannel listener = ServerSocketChannel.open();
ServerSocket serverSocket = listener.socket()
){
serverSocket.bind(new InetSocketAddress(2266));
//we can't use serverSocket.bind(2266);
}catch (IOException e){
e.printStackTrace();
}
答案 0 :(得分:2)
你的问题有点不清楚。
ServerSocket#bind()
建立连接的 本地 。如果您的系统有多个网络适配器和/或多个IP地址,并且您希望使用特定的本地适配器或IP地址连接套接字,那么您将提供包含主机和端口的完整InetSocketAddress(host,port)
,其中主机部分是您的本地IP地址之一。
在默认情况下,您只有一个IP地址,或者有多个但不关心哪一个用作源,您可以省略主机,只需指定端口,如示例所示。 / p>
API以这种方式定义。 TCP连接是对称,由两个端点定义。端点是一对(主机,端口)。这适用于连接的两端。因此bind()
调用采用InetSocketAddress
参数。为方便起见,如果您只提供端口,InetSocketAddress
将采用指定“使用任何可用接口”的默认主机。
API设计人员可以添加bind(int port)
方法来在幕后构建InetSocketAddress(port)
,但显然不觉得有必要。
答案 1 :(得分:0)
InetSocketAddress创建一个套接字地址,其中IP地址是通配符地址,端口号是指定值
通配符是可用于绑定的特殊IP地址。如果您不想听“一切”但可能是特定的IP,例如5.5.5.5,那么您将被绑定到该IP地址而不是其他IP地址。
但如果没有IP部分就意味着任何IP都会被收听,因此这种特殊用法几乎没有区别。