我有一个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 :(得分:2)
阻止recv
调用会在EOF上返回''
。
您的代码通过完全忽略它并再次返回recv
来处理它。哪个会立即再次返回''
,并且您将无限循环忽略该EOF。
这样做:
if data:
# etc.
else:
stop_flag = False
您可能需要阅读基本的套接字教程,例如Socket Programming HOWTO,它很早就解释了这一点:
当
recv
返回0字节时,表示另一方已关闭(或正在关闭)连接。您将不会再收到有关此连接的数据。如初。
...并显示了一些不同的处理方式(取决于来自另一方的未经请求的关闭是否是预期的说法“我们已完成”或意外错误)。