java.io.IOException:无法在指定的端口范围内为blob服务器分配套接字:0

java.io.IOException:无法在指定的端口范围内为blob服务器分配套接字:0,java,android,sockets,Java,Android,Sockets,我正在移植到Android。即使在独立模式下,也必须创建ServerSocket。这就是BlobServer.java如何创建ServerSocket: ServerSocket socketAttempt = NetUtils.createSocketFromPorts(ports, new NetUtils.SocketFactory() { @Override public ServerSocket createSocket(int port) th

我正在移植到Android。即使在独立模式下,也必须创建
ServerSocket
。这就是
BlobServer.java
如何创建
ServerSocket

    ServerSocket socketAttempt = NetUtils.createSocketFromPorts(ports, new NetUtils.SocketFactory() {
        @Override
        public ServerSocket createSocket(int port) throws IOException {
            return new ServerSocket(port, finalBacklog);
        }
    });

    if(socketAttempt == null) {
        throw new IOException("Unable to allocate socket for blob server in specified port range: "+serverPortRange);
    } else {
        this.serverSocket = socketAttempt;
    }
默认情况下,
port
值为
0
,因此使用的端口由操作系统决定。这是名为的
ServerSocket
构造函数:

public ServerSocket(int port, int backlog, InetAddress localAddress) throws IOException {
        checkListen(port);
        this.impl = factory != null ? factory.createSocketImpl()
                : new PlainServerSocketImpl();
        InetAddress addr = (localAddress == null) ? Inet6Address.ANY : localAddress;

        synchronized (this) {
            impl.create(true); //SOMETHING GOES WRONG!
            try {
                impl.bind(addr, port);
                readBackBindState();
                impl.listen(backlog > 0 ? backlog : DEFAULT_BACKLOG);
            } catch (IOException e) {
                close();
                throw e;
            }
        }
    }
在调试器之后,
addr
值是
://
(我不知道这是否正确)并且
端口是
0
(正确),但是当执行
impl.create(true)
时,
ServerSocket
构造函数的执行会中断(返回
null
)并且在
BlobServer.java
中抛出此异常(在检查返回的
ServerSocket
是否为空后):

java.io.IOException:无法在指定的端口范围内为blob服务器分配套接字:0
…

为什么会发生这种情况?我怎样才能解决这个问题

更新: 深入研究代码,我在
PlainServerSocketImpl.java
中找到了以下方法:

protected void create(boolean isStreaming) throws IOException {
    super.create(isStreaming);//CANNOT GO FURTHER WITH THE DEBUGGER!
    if (isStreaming) {
        setOption(SocketOptions.SO_REUSEADDR, Boolean.TRUE);
    }
}
问题是,当我在
super.create()
上用调试器点击“next”时,我无法再跟随它了,因为它打开了unix系统的
PainSocketImpl.java
(使用
本机方法调用)。如何继续进行调试

addr值为://(我不知道这是否正确)

事实并非如此,这几乎可以肯定是问题的根源。主机地址不是URL。它应该是一个虚线四路IP地址或DNS已知的主机名

端口为0(正确),但执行impl.create(true)时会中断ServerSocket构造函数的执行(返回null),并且在BlobServer.java中引发此异常

您自己的错误消息不感兴趣。感兴趣的是原始
IOException
中的原始错误消息。不要编造你自己的信息。这使得调试变得不可能

(检查返回的ServerSocket是否为空后):


它不是空的。它没有被退回。相反,引发了一个异常。

我同意您的“自己的消息”,但此消息不是我的,是Flinks:)顺便说一句,我将尝试获取原始IOException中的原始错误。顺便说一句,是的,该值为null(查看我更新的代码的第一个代码部分),在您上次的更新中,或者实际上在JLS中的任何地方,都没有任何东西表明抛出异常的方法也可以返回null。只有当某个未公开的中间层捕捉到异常并返回null时,这才有可能。这似乎是一个写得非常糟糕的软件,不管谁负责。我还很好奇,调用第三个参数为
null
的三参数构造函数的两参数构造函数,如何在三参数构造函数中以非null值结束。
java.io.IOException: Unable to allocate socket for blob server in specified port range: 0