Java 如何知道另一侧的插座何时关闭

Java 如何知道另一侧的插座何时关闭,java,android,python,sockets,Java,Android,Python,Sockets,我有一个android应用程序(java)和一个python“服务器”,android应用程序通过套接字连接到python服务器。当我通过java(socket.close())关闭套接字时,python程序不会像我预料的那样抛出异常,但当我关闭android应用程序(完全关闭)时,它会抛出“[Errno 10054]一个现有连接被远程主机强制关闭”,这是我希望它通过套接字关闭它所要做的 我如何知道android应用程序何时关闭了套接字而不退出应用程序本身 python: def __init_

我有一个android应用程序(java)和一个python“服务器”,android应用程序通过套接字连接到python服务器。当我通过java(socket.close())关闭套接字时,python程序不会像我预料的那样抛出异常,但当我关闭android应用程序(完全关闭)时,它会抛出“[Errno 10054]一个现有连接被远程主机强制关闭”,这是我希望它通过套接字关闭它所要做的

我如何知道android应用程序何时关闭了套接字而不退出应用程序本身

python:

def __init__(self, IP, port):
        try:
            self.acceptor = socket.socket()
            self.acceptor.bind((IP, port))
            self.acceptor.listen(1)
        except socket.error, e:
            print e

def start_server(self):
    #Start server:
    try:
        self.sock, self.connecting_ip = self.acceptor.accept() 
        print self.connecting_ip[0] + " connected!"

    except socket.error, e:
        print e

def wait_for_command(self):
    stop_flag = True
    try:
        while stop_flag:
            data = self.sock.recv(1024)
            if data:
                data_tuple = self.split_msg(data)
                if data_tuple[0] == self.MSG_REQ:
                    print data_tuple[1]
                    stop_flag = False
    except socket.error, e
         print e

阻塞
recv
调用在EOF上返回
'

您的代码通过完全忽略它并再次返回到
recv
来处理它。它将立即再次返回
,并且您将无限循环忽略该EOF

只要这样做:

if data:
    # etc.
else:
    stop_flag = False

您可能想阅读一本基本的套接字教程,如,它很早就解释了这一点:

recv
返回0字节时,表示另一端已关闭(或正在关闭)连接。您将不会收到有关此连接的更多数据。永远


…并展示了几种不同的处理方式(取决于对方主动关闭是表示“我们完成了”的预期方式还是意外错误)。

但android应用程序没有关闭套接字;这发生在服务器上。。。或者你是这么说的。如果套接字在另一端被关闭,我认为知道它的唯一方法是尝试发送一些信息并捕获异常。在关闭它之前尝试发送特定消息。否则,您唯一能做的就是等待a请求挂起很长时间。@ElliottFrisch-TCP中肯定有一个谨慎的断开连接事件。它是任何设置了FIN位的数据包,通常在调用
.close()
.shutdown()
后发送。如果一方未发送FIN,但在内部删除了其连接状态,则发送给它的后续数据包应导致它发送RST响应。