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

时间:2014-01-06 20:53:13

标签: java android python sockets

我有一个Android应用程序(java)和一个python"服务器",android应用程序通过套接字连接到python服务器。当我通过java(socket.close())关闭套接字时,python程序不会抛出异常,例如我将它除外,但是当我关闭android应用程序(完全关闭)时它抛出" [Errno 10054]现有的连接被远程主机强行关闭"这是我希望它通过套接字关闭它。

如何在不退出应用程序本身的情况下知道Android应用程序何时关闭套接字?

蟒:

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

1 个答案:

答案 0 :(得分:2)

阻止recv调用会在EOF上返回''

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

这样做:

if data:
    # etc.
else:
    stop_flag = False

您可能需要阅读基本的套接字教程,例如Socket Programming HOWTO,它很早就解释了这一点:

  

recv返回0字节时,表示另一方已关闭(或正在关闭)连接。您将不会再收到有关此连接的数据。如初。

...并显示了一些不同的处理方式(取决于来自另一方的未经请求的关闭是否是预期的说法“我们已完成”或意外错误)。