Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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
Android 为什么在重新连接之前需要在关闭套接字后等待?_Android_Sockets - Fatal编程技术网

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);