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

字符串与bytes拼接问题:修复Python Netcat替代代码报错

修复Python Netcat替代工具的字节/字符串兼容问题

原代码的核心问题是Python3中socket的recv()返回bytes对象,send()要求传入bytes,但代码里混用了字符串和bytes类型,导致拼接、判断时出现类型错误。以下是完整修复方案:

修复后的完整代码

import socket


class Netcat:
    """ Python 'netcat like' module """

    def __init__(self, ip, port):
        self.buff = b""  # 改为bytes类型缓冲区
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.connect((ip, port))

    def read(self, length=1024):
        """ Read 1024 bytes off the socket """
        return self.socket.recv(length)
 
    def read_until(self, data):
        """ Read data into the buffer until we hit the target data """
        # 自动将字符串参数转为bytes
        if isinstance(data, str):
            data = data.encode('utf-8')
        while data not in self.buff:
            self.buff += self.socket.recv(1024)
 
        pos = self.buff.find(data)
        rval = self.buff[:pos + len(data)]
        self.buff = self.buff[pos + len(data):]
 
        return rval
 
    def write(self, data):
        # 自动将字符串参数转为bytes后发送
        if isinstance(data, str):
            data = data.encode('utf-8')
        self.socket.send(data)
    
    def close(self):
        self.socket.close()


# 使用示例
nc = Netcat('192.168.0.1', 80)

# 读取到提示符(支持直接传字符串)
nc.read_until('>')

# 发送命令(支持直接传字符串)
nc.write('new\n')
nc.read_until('>')

关键修改说明

  • 缓冲区类型统一:把self.buff初始化为b""(bytes空值),避免字符串和bytes拼接的类型错误
  • 自动类型兼容:在read_until()和write()方法中加入判断,若传入的是字符串则自动编码为bytes,调用时无需手动处理,保持接口易用性
  • bytes操作一致性:所有缓冲区的查找、切片操作都基于bytes类型,和socket的recv/send行为匹配

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.05 02:15:12