You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python Socket如何实现Node.js中socket.on('end')的连接关闭处理?

如何在Python TCP客户端中处理连接关闭事件?

Node.js 中的连接关闭处理

Node.js 开发TCP服务器时,可以通过end事件处理Socket连接的优雅关闭,示例代码如下:

const net = require('node:net');
const client = net.createConnection({ port: 8124 }, () => {
  // 'connect' 回调
  console.log('connected to server!');
  // ... 发送数据逻辑
});
client.on('data', (data) => {
  // 处理收到的数据
});
client.on('end', () => {
  console.log('disconnected from server');
}); 

Python 客户端的问题

我用Python编写了TCP客户端代码,但找不到和Node.js等价的连接关闭事件处理方式:

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 8124))
try:
    data = sock.recv(1024)
except ConnectionResetError:
    print("ConnectionResetError closed by peer")
except socket.error as e:
    print("socket.error closed by peer")
except Exception as e:
    print("Exception closed by peer")

原本以为连接关闭会被ConnectionResetError或socket.error捕获,但当Node.js服务器关闭Socket时,这些异常处理代码均未触发,Python程序直接跳出try块执行后续代码。

正确的处理方式

TCP连接的关闭分为优雅关闭和强制重置两种情况,Python的Socket处理逻辑和Node.js不同:

  1. 优雅关闭:当服务器正常关闭Socket(比如Node.js触发end事件),客户端调用recv()会返回空字节串b'',这是连接关闭的信号,需要主动检测该返回值。
  2. 强制重置:只有当服务器强制断开连接(比如进程直接终止)时,才会触发ConnectionResetError。

修改后的代码示例:

import socket

sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
sock.connect(('localhost', 8124))

try:
    # 循环接收数据,持续检测连接状态
    while True:
        data = sock.recv(1024)
        if not data:
            print("连接被服务器优雅关闭")
            break
        # 处理收到的数据
        print(f"收到数据: {data.decode('utf-8')}")
except ConnectionResetError:
    print("连接被服务器强制重置")
except socket.error as e:
    print(f"Socket错误: {str(e)}")
except Exception as e:
    print(f"未知异常: {str(e)}")
finally:
    # 确保关闭Socket
    sock.close()

补充:类似问题参考

  • Python Socket:如何在服务端检测客户端已关闭/断开连接
  • 如何判断Python中的Socket连接是否已关闭
  • Python:检测Socket因任何原因断开的情况

内容的提问来源于Stack Exchange,提问作者Qiulang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.16 17:07:11