2014-01-06 79 views
1

我有一個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 
+0

但android應用程序不關閉套接字;發生在服務器上......或者你說過的。 –

+0

如果套接字在另一邊被關閉,我認爲知道它的唯一方法是試圖發送一些信息並捕獲異常。 – zozelfelfo

+0

您使用UDP或TCP套接字嗎? –

回答

2

一個阻塞recv調用返回''上EOF。

您的代碼通過完全忽略它並重新返回recv來處理它。這將立即返回'',並且您將無限循環忽略該EOF。

只是這樣做:

if data: 
    # etc. 
else: 
    stop_flag = False 

你可能想讀一個基本的插座教程,像Socket Programming HOWTO,這也解釋了這個很早就:

recv返回0字節,這意味着另一方已關閉(或正在關閉)連接。您將不會收到有關此連接的更多數據。永遠。

...並顯示處理它的幾種不同方式(取決於來自另一端的未經請求的關閉是預期的方式來說「我們完成了」或意外的錯誤)。