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

Ruby 3.3.1:实现TCP套接字单字节监听并写入文件

解决TCP服务器逐字节即时处理的问题

首先纠正一个关键错误:recvfrom()是UDP套接字专属方法,TCP套接字应该使用recv()。你遇到的等待CR/LF的问题,要么是之前的字符串实现依赖换行符做分隔,要么是对TCP字节流的特性理解有误,下面给出直接可用的逐字节处理方案:

核心逻辑

TCP是无消息边界的字节流协议,只要每次调用recv(1),就会在有字节到达时立即返回(阻塞模式下会等待至少1个字节),完全不需要依赖CR/LF作为触发条件。

示例代码(Python)

import socket

# 配置监听参数
HOST = '0.0.0.0'  # 监听所有可用网卡
PORT = 12345       # 替换为你需要的TCP端口

# 创建并启动TCP服务器
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as server_sock:
    server_sock.bind((HOST, PORT))
    server_sock.listen()
    print(f"正在监听TCP端口 {PORT}...")
    conn, client_addr = server_sock.accept()
    with conn:
        print(f"客户端 {client_addr} 已连接")
        while True:
            # 每次仅接收1个字节,阻塞直到有数据到达
            single_byte = conn.recv(1)
            if not single_byte:
                # 客户端断开连接时,recv会返回空字节串
                print("客户端已断开连接")
                break
            # 转换为ASCII码并输出
            ascii_code = ord(single_byte)
            print(f"收到字节: {single_byte!r} | ASCII码: {ascii_code}")

关键细节说明

  • 使用recv(1):参数指定为1,强制每次最多接收1个字节,只要有单个字节到达就会立即返回,不会等待更多数据(包括CR/LF)。
  • 阻塞模式适配:默认TCP套接字为阻塞模式,recv(1)会自动等待字节到达,完全适配你低数据量的场景,无需处理非阻塞的复杂逻辑。
  • 禁用Nagle算法(可选):如果遇到极个别场景下的字节延迟,可以在建立连接后禁用Nagle算法,避免小数据包被合并发送:
    conn.setsockopt(socket.IPPROTO_TCP, socket.TCP_NODELAY, 1)
    
  • 客户端测试注意:部分工具(如telnet)默认会缓存输入直到换行才发送,测试时建议自己写一个简单的TCP客户端,逐个发送字节验证效果。

内容的提问来源于stack exchange,提问作者Michael McGrath

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.25 05:09:56