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

Python流处理:如何更快地向服务器发送数据

如何提升TCP连接发送字符串的速度?

你的核心问题出在每次发送单个字符串就新建并关闭TCP连接——TCP连接的建立(三次握手)和关闭(四次挥手)本身就需要客户端与服务器交换多个数据包,这个过程的延迟累加起来,直接导致了每2秒才能发送一个字符串的低效表现。

问题根源

当前代码逻辑是:每次accept()拿到新连接后,只发送一条数据就立刻close(),完全没有利用TCP连接可以持续传输数据的特性。重复的连接建立/关闭操作,是速度慢的罪魁祸首。

优化方案

最直接有效的优化是保持连接打开,在同一个连接内持续发送数据,直到传输任务结束或客户端主动断开。如果场景允许,还可以配合批量发送进一步提升效率。

修改后的服务器端代码

import random
import linecache
import time  # 可选,用于控制发送频率

# 假设s是你已经初始化好的socket对象
while True:
    conn, addr = s.accept()
    print(f"已与 {addr} 建立连接")
    try:
        # 保持连接,持续发送数据
        while True:
            # 生成行号(可选:用集合去重避免重复发送同一行)
            line_number = random.randint(1, 2261074)
            # sent_lines = set()  # 提前初始化集合
            # while line_number in sent_lines:
            #     line_number = random.randint(1, 2261074)
            # sent_lines.add(line_number)
            
            line = linecache.getline(filename, line_number)
            sendit = line.split(" ")[1]
            print(type(sendit))
            print(f"正在发送: {sendit}")
            
            # Python3需注意:字符串要编码为字节流发送
            # conn.send(sendit.encode('utf-8'))
            conn.send(sendit)
            
            # 可选:添加微小延迟,避免发送速率过高
            # time.sleep(0.001)
    except BrokenPipeError:
        print(f"与 {addr} 的连接已断开")
    finally:
        conn.close()
print('数据流传输结束。')

配套说明

  • 客户端同步调整:客户端需要建立一次连接后持续接收数据,不能每次接收都重新发起连接,否则服务器端的优化无法生效。
  • Python3编码处理:如果使用Python3,字符串必须编码为字节流(比如utf-8)才能通过socket发送,否则会抛出类型错误。
  • 去重优化:如果需要避免重复发送同一行,用集合记录已发送行号的效率远高于列表,集合的查找操作是O(1)复杂度。
  • 速率控制:如果发送速度过快导致客户端处理不过来,可以通过time.sleep()微调发送频率,数值根据实际场景调整。

内容的提问来源于stack exchange,提问作者osman tamer

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:03:29