服务器未实现Java/android socket.close()
我在试图让java服务器实现(android/java)客户端已关闭TCP套接字连接时遇到了一个问题。我认为当客户端在服务器未实现Java/android socket.close(),java,android,sockets,Java,Android,Sockets,我在试图让java服务器实现(android/java)客户端已关闭TCP套接字连接时遇到了一个问题。我认为当客户端在套接字上调用close()时,服务器会捕获一个IOException,但事实并非如此t_recv是一个线程,它从BufferedReader in接收,而t_send使用PrintWriter out发送。在中关闭会导致超时和崩溃,而在中关闭似乎并没有什么作用。PrintWriter在t_send线程的构造函数中创建,而BufferedReader在t_recv线程的构造函数中创
套接字上调用close()
时,服务器会捕获一个IOException
,但事实并非如此t_recv
是一个线程,它从BufferedReader in
接收,而t_send
使用PrintWriter out
发送。在
中关闭会导致超时和崩溃,而在
中关闭似乎并没有什么作用。PrintWriter
在t_send
线程的构造函数中创建,而BufferedReader
在t_recv
线程的构造函数中创建。为了调试它,我在两个线程中创建了blankrun()
方法,并且出现了相同的行为
一个有趣的注意事项:客户端是一个Android应用程序,每当emulator冻结并且windows必须强制关闭它时,IOException
会在服务器中被捕获,并显示“User x.x.x.x left”消息
客户端关闭连接:
try {
// t_recv.in.close(); - times out and crashes
// t_send.out.close(); - appears to do nothing
socket.close();
} catch (IOException e) {
e.printStackTrace();
}
正在等待客户端断开连接的服务器:
for (;;)
{
try {
while ( (msg = in.readLine()) != null)
{
response = msg;
System.out.println(response);
server.broadcast(response);
}
} catch (IOException e) {
System.out.println("User '" + socket.getInetAddress().toString() + "' left");
try {
socket.close();
out.close();
in.close();
} catch (IOException e1) {
e1.printStackTrace();
System.exit(-1);
}
break;
}
}
谢谢您的时间。假设
中的是一个缓冲读取器,错误在这一行:
while ( (msg = in.readLine()) == null);
如果
中的当前处于EOF,则将永远循环。应该是:
while ( (msg = in.readLine()) != null);
有关详细信息,请参见javadoc,特别注意它返回null
的条件,感谢您的回复。我正在使用while((msg=in.readLine())==null)代码>基本繁忙,等待消息可用。我稍微编辑了代码以显示这一点。现在可能有点草率,但它可以连续接收消息…@Shaun-你搞错了。readLine不是这样工作的。阅读javadoc。所以我应该在((msg=in.readLine())!=null){//process}
时执行类似的操作,当我断开客户端套接字时,readLine()
应该抛出一个IOException
?谢谢。好的-我已经用这个替换了代码。但是服务器仍然不知道客户端正在关闭套接字。有什么建议吗?谢谢。@Shaun-当我说读javadoc时,我是想让你读javadoc。。。不要问一大堆javadocs明确回答的其他问题。