Java 如何知道另一侧的插座何时关闭
我有一个android应用程序(java)和一个python“服务器”,android应用程序通过套接字连接到python服务器。当我通过java(socket.close())关闭套接字时,python程序不会像我预料的那样抛出异常,但当我关闭android应用程序(完全关闭)时,它会抛出“[Errno 10054]一个现有连接被远程主机强制关闭”,这是我希望它通过套接字关闭它所要做的 我如何知道android应用程序何时关闭了套接字而不退出应用程序本身 python:Java 如何知道另一侧的插座何时关闭,java,android,python,sockets,Java,Android,Python,Sockets,我有一个android应用程序(java)和一个python“服务器”,android应用程序通过套接字连接到python服务器。当我通过java(socket.close())关闭套接字时,python程序不会像我预料的那样抛出异常,但当我关闭android应用程序(完全关闭)时,它会抛出“[Errno 10054]一个现有连接被远程主机强制关闭”,这是我希望它通过套接字关闭它所要做的 我如何知道android应用程序何时关闭了套接字而不退出应用程序本身 python: def __init_
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
您可能想阅读一本基本的套接字教程,如,它很早就解释了这一点: 当
recv
返回0字节时,表示另一端已关闭(或正在关闭)连接。您将不会收到有关此连接的更多数据。永远
…并展示了几种不同的处理方式(取决于对方主动关闭是表示“我们完成了”的预期方式还是意外错误)。但android应用程序没有关闭套接字;这发生在服务器上。。。或者你是这么说的。如果套接字在另一端被关闭,我认为知道它的唯一方法是尝试发送一些信息并捕获异常。在关闭它之前尝试发送特定消息。否则,您唯一能做的就是等待a请求挂起很长时间。@ElliottFrisch-TCP中肯定有一个谨慎的断开连接事件。它是任何设置了FIN位的数据包,通常在调用
.close()
或.shutdown()
后发送。如果一方未发送FIN,但在内部删除了其连接状态,则发送给它的后续数据包应导致它发送RST响应。