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

