Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SocketServer始终为动态端口引发BindException_Java_Windows_Sockets_Tcp_Tcpserver - Fatal编程技术网

Java SocketServer始终为动态端口引发BindException

Java SocketServer始终为动态端口引发BindException,java,windows,sockets,tcp,tcpserver,Java,Windows,Sockets,Tcp,Tcpserver,定义 已知端口范围为[01023]的端口号 注册端口范围为[1024,49151]的端口号 动态端口端口号在[4915265535]范围内 我正在尝试创建一个SocketServer对象。当我允许SocketServer选择一个动态端口(通过绑定到端口0)时,它会按预期工作。如果我显式指定一个注册端口,它将按预期工作。但是,当我指定一个动态端口时,它总是抛出一个BindException,并显示消息“Address ready in use:JVM\u Bind”。异常的堆栈跟踪的顶部是: at

定义
已知端口
范围为[01023]的端口号
注册端口
范围为[1024,49151]的端口号
动态端口
端口号在[4915265535]范围内

我正在尝试创建一个
SocketServer
对象。当我允许
SocketServer
选择一个动态端口(通过绑定到端口0)时,它会按预期工作。如果我显式指定一个注册端口,它将按预期工作。但是,当我指定一个动态端口时,它总是抛出一个
BindException
,并显示消息“Address ready in use:JVM\u Bind”。异常的堆栈跟踪的顶部是:

at java.net.DualStackPlainSocketImpl.bind0(Native Method)
at java.net.DualStackPlainSocketImpl.socketBind(DualStackPlainSocketImpl.java:106)
at java.net.AbstractPlainSocketImpl.bind(AbstractPlainSocketImpl.java:387)
at java.net.PlainSocketImpl.bind(PlainSocketImpl.java:190)
at java.net.ServerSocket.bind(ServerSocket.java:375)
at java.net.ServerSocket.<init>(ServerSocket.java:237)
at java.net.ServerSocket.<init>(ServerSocket.java:128)
我还尝试了以下替代方案:

SocketServer createServer(final int port) throws IOException {
    // Create a new socket server
    final SocketServer server = new SocketServer();
    server.setReuseAddress(true);
    try {
        // Try to bind to all interfaces
        server.bind(new InetSocketAddress(port), 1);
    } catch (BindException e) {
        // If that fails, try to bind to the primary IP address
        final InetAddress address = InetAddress.getLocalHost();
        server.bind(new InetSocketAddress(address, port), 1);
    }
    return server;
}

端口
是动态端口时,这两种备选方案都会引发BindException。根据
netstat-an
的结果,我已经验证了我测试的大约50个动态端口都可用。有没有办法为特定的动态端口创建一个
SocketServer

虽然不理想,因为它涉及注册表编辑,但上提供了一个答案

可以将Windows设置为从其动态端口范围中排除端口。只需将要排除的范围添加到多字符串值:

HKLM\System\CurrentControlSet\Services\TCPIP\Parameters\ReservedPorts


因此,在我的例子中,我需要使用端口55101-55107,因此我将该文本添加到注册表值并重新启动计算机。虽然此解决方案允许我使用这些端口,但令人失望的是,我必须在任何希望使用它们的Windows计算机上编辑注册表。此外,如果将来我必须添加另一个动态端口,我将不得不重新编辑注册表。

我建议您跟踪
端口的值。这种代码适用于其他人。
SocketServer createServer(final int port) throws IOException {
    // Create a new socket server
    final SocketServer server = new SocketServer();
    server.setReuseAddress(true);
    try {
        // Try to bind to all interfaces
        server.bind(new InetSocketAddress(port), 1);
    } catch (BindException e) {
        // If that fails, try to bind to the primary IP address
        final InetAddress address = InetAddress.getLocalHost();
        server.bind(new InetSocketAddress(address, port), 1);
    }
    return server;
}