Android 为什么在重新连接之前需要在关闭套接字后等待?
请忽略作者要求删除的此问题。 有关原因,请参见评论 下面的代码总是抛出Android 为什么在重新连接之前需要在关闭套接字后等待?,android,sockets,Android,Sockets,请忽略作者要求删除的此问题。 有关原因,请参见评论 下面的代码总是抛出 java.net.SocketException: Socket closed 在最后一条语句中(socket.connect(myInetSocketAddress,6000);) 如果添加了waiting(Sleep()),则一切正常,如下所示: Socket socket = new Socket(); socket.connect( myInetSocketAddress, 6000); //use socket
java.net.SocketException: Socket closed
在最后一条语句中(socket.connect(myInetSocketAddress,6000);
)
如果添加了waiting(Sleep()),则一切正常,如下所示:
Socket socket = new Socket();
socket.connect( myInetSocketAddress, 6000);
//use socket to do some reading
...
socket.close();
Thread.sleep(1000); //critical to prevent java.net.SocketException: Socket closed
socket = new Socket();
//The following works fine after Thread.sleep(1000)
socket.connect(myInetSocketAddress, 6000);
有人能解释一下吗
为什么在重新连接前关闭套接字后需要等待
事实并非如此
这里并不是睡眠造成了什么不同,而是newsocket()
行
显然,您的第一段代码并不是一个精确的表示。您得到了SocketException:socketclosed
,这表明您正在尝试重新连接原始套接字,因此运行它时显然没有new socket()
行
这也解释了为什么调用
setReuseAddress()
没有任何区别。这只会对BindException,
有帮助,并且只有当您尝试使用相同的本地IP地址和端口,使用4参数connect(),
进行连接时,才会得到它,而您没有这样做。这不是真正的代码。您没有从该代码中得到该异常。@EJP我刚刚刷新了Java套接字代码,您似乎是对的。@EJP请在您的回答后查看我的评论,并随时告诉我如何澄清我的帖子,以使您相信代码的最后一条语句引发了异常。@Hong您无法说服我。new Socket()
的结果不是闭合的套接字。如果您尝试重新连接旧的套接字,而不是创建一个新的套接字并连接它,它只能抛出“套接字关闭”异常。我认为您可能是对的。代码与实际代码几乎相同,异常正好在我描述的地方被捕获。但是,有另一个线程正在使用套接字,并且可能正在关闭套接字。我明天得调查一下。这里已经很晚了。如果我的代码把你弄糊涂了,很抱歉。请随时告诉我如何澄清。关于抛出异常的最后一个语句的第一句话是否令人困惑?也许我还没听懂你的回答。@Hong请停止睡眠,留下第二行new Socket()。你会发现问题神奇地消失了。实际上这是正确的答案,而不是标记为答案的答案。
Socket socket = new Socket();
socket.connect( myInetSocketAddress, 6000);
//use socket to do some reading
...
socket.close();
Thread.sleep(1000); //critical to prevent java.net.SocketException: Socket closed
socket = new Socket();
//The following works fine after Thread.sleep(1000)
socket.connect(myInetSocketAddress, 6000);