Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/316.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
服务器未实现Java/android socket.close()_Java_Android_Sockets - Fatal编程技术网

服务器未实现Java/android socket.close()

服务器未实现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线程的构造函数中创

我在试图让java服务器实现(android/java)客户端已关闭TCP套接字连接时遇到了一个问题。我认为当客户端在
套接字上调用
close()
时,服务器会捕获一个
IOException
,但事实并非如此
t_recv
是一个线程,它从
BufferedReader in
接收,而
t_send
使用
PrintWriter out
发送。在
中关闭
会导致超时和崩溃,而在
中关闭
似乎并没有什么作用。
PrintWriter
t_send
线程的构造函数中创建,而
BufferedReader
t_recv
线程的构造函数中创建。为了调试它,我在两个线程中创建了blank
run()
方法,并且出现了相同的行为

一个有趣的注意事项:客户端是一个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明确回答的其他问题。