gpt4 book ai didi

java - 如何知道另一侧的套接字何时关闭

转载 作者:行者123 更新时间:2023-11-29 21:19:08 25 4
gpt4 key购买 nike

我有一个 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com