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

标签 java android python sockets

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

相关文章:

java - 我的 log4j2 日志文件总是每行都有双输出。请问我怎样才能停止复制?

android - 使用Visual Studio在Flutter上运行Gradle时出错

python - "TypeError: ' 元数据 ' object is not iterable"

python - 从列表中删除与子字符串匹配的项目

java - 安装 JDK 和使用转储之间的区别

java - @Bean注释在Spring Boot中不起作用

java - Android ReSTLet 框架 - 获取文件列表并下载文件

android - 使用 ProgressBar 和 AsyncTask 发送短信 |安卓

android - 如何从云Firestore检索自定义对象?

math.log 函数中的 python 数学域错误