java.io.IOException:无法在指定的端口范围内为blob服务器分配套接字:0
我正在移植到Android。即使在独立模式下,也必须创建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
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