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
相关产品推荐
相关产品推荐

