为什么我们必须使用InetSocketAddress输入我们的端口号以使用ServerSocketChannel

时间:2016-02-14 07:30:01

标签: java

为什么我们必须创建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();
    }

2 个答案:

答案 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都会被收听,因此这种特殊用法几乎没有区别。