我有一个 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
您可能想阅读基本的套接字教程,例如 Socket Programming HOWTO ,这很早就解释了这一点:
When a
recv
returns 0 bytes, it means the other side has closed (or is in the process of closing) the connection. You will not receive any more data on this connection. Ever.
... 并展示了几种不同的处理方式(取决于来自另一方的主动关闭是一种预期的方式来表示“我们完成了”还是意外错误)。
关于java - 如何知道另一侧的套接字何时关闭,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20959056/