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

Python中如何为socketserver.StreamRequestHandler设置自定义换行符?

自定义socketserver.StreamRequestHandler的换行符方案

要实现基于自定义分隔符的readline功能,由于StreamRequestHandler默认的rfile(_io.BufferedReader)仅支持\n作为换行符,标准库没有提供直接修改分隔符的接口,你可以通过以下两种方案解决:

方案1:重写rfile为自定义读取类

实现一个支持指定分隔符的读取类,在StreamRequestHandler的setup方法中替换默认的rfile,保持原有的readline调用习惯:

import socketserver
import io

class CustomLineReader(io.BufferedIOBase):
    def __init__(self, raw_socket, delimiter=b'||'):
        self.raw = raw_socket
        self.delimiter = delimiter
        self.buffer = b''

    def readline(self):
        # 持续读取数据直到缓冲中出现分隔符
        while self.delimiter not in self.buffer:
            chunk = self.raw.read(1024)
            if not chunk:
                # 到达连接末端,返回剩余缓冲内容
                line = self.buffer
                self.buffer = b''
                return line
            self.buffer += chunk
        # 分割出完整的一行,保留缓冲中剩余内容
        line, self.buffer = self.buffer.split(self.delimiter, 1)
        return line + self.delimiter  # 可选:保留分隔符在返回结果中

class CustomTCPHandler(socketserver.StreamRequestHandler):
    def setup(self):
        super().setup()
        # 替换默认rfile为自定义读取器,这里用b'||'作为示例分隔符
        self.rfile = CustomLineReader(self.connection, delimiter=b'||')

    def handle(self):
        while True:
            line = self.rfile.readline()
            if not line:
                break
            print(f"Received line: {line.decode('utf-8')}")
            self.wfile.write(b"Processed: " + line)

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    with socketserver.TCPServer((HOST, PORT), CustomTCPHandler) as server:
        server.serve_forever()

方案2:手动缓冲并分割数据

如果不想自定义类,可在handle方法中手动维护缓冲区,按自定义分隔符分割数据:

import socketserver

class CustomTCPHandler(socketserver.StreamRequestHandler):
    def handle(self):
        buffer = b''
        delimiter = b'||'
        while True:
            chunk = self.rfile.read(1024)
            if not chunk:
                break
            buffer += chunk
            # 循环处理缓冲中所有完整的行
            while delimiter in buffer:
                line, buffer = buffer.split(delimiter, 1)
                print(f"Received line: {line.decode('utf-8')}")
                self.wfile.write(b"Processed: " + line + delimiter)
        # 处理连接关闭时剩余的未完整数据
        if buffer:
            print(f"Remaining unprocessed data: {buffer.decode('utf-8')}")

if __name__ == "__main__":
    HOST, PORT = "localhost", 9999
    with socketserver.TCPServer((HOST, PORT), CustomTCPHandler) as server:
        server.serve_forever()

方案对比

  • 自定义类方案:更贴合原StreamRequestHandler的使用逻辑,代码结构清晰,适合需要复用读取逻辑的场景。
  • 手动缓冲方案:实现更轻量,无需额外类定义,适合简单的单场景需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 00:04:59