博客
关于我
Python 解决粘包的问题
阅读量:753 次
发布时间:2019-03-23

本文共 2589 字,大约阅读时间需要 8 分钟。

为了更好地微调客户端和服务器代码,提高其连接的稳定性和兼容性,可以按照以下步骤进行优化:

客户端代码优化:

  • 数据接收优化:客户端改用逐次接收数据的方式,以确保完整性。修改代码如下:
    # client.pyimport socketimport structphone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)phone.connect(('127.0.0.1', 9909))while True:    cmd = input('> : ').strip()    if not cmd:        continue    phone.send(cmd.encode('utf-8'))    header = struct.pack('i', (len(cmd.encode('utf-8')) + 1024))  # 预留头信息    phone.send(header)    total_size = header[3]  # 获取大小    recv_data = b''    recv_size = 0    while recv_size < total_size:        res = phone.recv(1024)        if not res:            break        recv_data += res        recv_size += len(res)    print(recv_data.decode('utf-8'), end='\n')phone.close()
  • 2. ** socket 设置优化**:设置socket选项,使其在多次连接时更稳定,调整socket选项:   ```python   phone.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)   phone.bind(('0.0.0.0', 9909))

    服务端代码优化:

  • SSL/TLS 配置:建议为通信加密,提高安全性:
    # server.pyimport socketimport subprocessimport structphone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)phone.bind(('0.0.0.0', 9909))phone.listen(5)print('Starting...')while True:    conn, client_addr = phone.accept()    client_addr_str = str(client_addr)    print(f'Connected by {client_addr_str}')    with conn:        while True:            try:                cmd = conn.recv(8096).decode('utf-8')                if not cmd:                    break                obj = subprocess.Popen(                    cmd, shell=False, stdout=subprocess.PIPE,                    stderr=subprocess.PIPE,                    text=True                )                stdout = obj.stdout.read()                stderr = obj.stderr.read()                header = struct.pack('i', len(stdout) + len(stderr))                conn.sendall(header)                conn.sendall(stdout.encode('utf-8') + stderr.encode('utf-8'))            except ConnectionResetError:                breakphone.close()
  • 2. **线程管理优化**:使用with语句确保socket及相关资源自动释放,避免资源泄漏:   ```python   with conn:       # 处理连接逻辑
    1. 命令安全处理:限制命令执行权限,避免恶意攻击:

      max_cmd_len = 1024if len(cmd) > max_cmd_len:    cmd = cmd[:max_cmd_len]obj = subprocess.Popen(    cmd,    shell=False,    stderr=subprocess.PIPE,    stdout=subprocess.PIPE,    text=True)
    2. 数据发送优化:防止数据丢包,使用sendall:

      conn.sendall(header)conn.sendall(stdout + stderr)
    3. 模型示例调整

      • 确保在网络环境中,双方都具有访问所用端口的权限。
      • 部分环境下,较高的socket选项设置有助于连接稳定性。
      • 增加错误处理机制,如超时设置:
        phone.setsocketoption(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 600)

      本地测试建议

    4. netcat 测试连接:
      nc -zvz 127.0.0.1 9909
    5. 检查防火墙设置,判断端口是否开启。
    6. 查看网络设备(如路由器)是否阻止该端口的流量。
    7. 总结:通过以上优化措施,客户端/服务器代码应能更加稳定可靠,适用于更广泛的用途。建议进行逐步测试,确保每个部分正常工作后再整合运行。如有继续问题,请详细记录日志和错误信息,供进一步分析。

    转载地址:http://xdyzk.baihongyu.com/

    你可能感兴趣的文章
    OAuth2 + Gateway统一认证一步步实现(公司项目能直接使用),密码模式&授权码模式
    查看>>
    OAuth2 Provider 项目常见问题解决方案
    查看>>
    OAuth2 vs JWT,到底怎么选?
    查看>>
    Vue.js 学习总结(14)—— Vue3 为什么推荐使用 ref 而不是 reactive
    查看>>
    oauth2-shiro 添加 redis 实现版本
    查看>>
    OAuth2.0_JWT令牌-生成令牌和校验令牌_Spring Security OAuth2.0认证授权---springcloud工作笔记148
    查看>>
    OAuth2.0_JWT令牌介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记147
    查看>>
    OAuth2.0_介绍_Spring Security OAuth2.0认证授权---springcloud工作笔记137
    查看>>
    OAuth2.0_完善环境配置_把资源微服务客户端信息_授权码存入到数据库_Spring Security OAuth2.0认证授权---springcloud工作笔记149
    查看>>
    OAuth2.0_授权服务配置_Spring Security OAuth2.0认证授权---springcloud工作笔记140
    查看>>
    OAuth2.0_授权服务配置_三项内容_Spring Security OAuth2.0认证授权---springcloud工作笔记141
    查看>>
    OAuth2.0_授权服务配置_令牌服务和令牌端点配置_Spring Security OAuth2.0认证授权---springcloud工作笔记143
    查看>>
    OAuth2.0_授权服务配置_客户端详情配置_Spring Security OAuth2.0认证授权---springcloud工作笔记142
    查看>>
    OAuth2.0_授权服务配置_密码模式及其他模式_Spring Security OAuth2.0认证授权---springcloud工作笔记145
    查看>>
    OAuth2.0_授权服务配置_授权码模式_Spring Security OAuth2.0认证授权---springcloud工作笔记144
    查看>>
    OAuth2.0_授权服务配置_资源服务测试_Spring Security OAuth2.0认证授权---springcloud工作笔记146
    查看>>
    OAuth2.0_环境介绍_授权服务和资源服务_Spring Security OAuth2.0认证授权---springcloud工作笔记138
    查看>>
    OAuth2.0_环境搭建_Spring Security OAuth2.0认证授权---springcloud工作笔记139
    查看>>
    oauth2.0协议介绍,核心概念和角色,工作流程,概念和用途
    查看>>
    OAuth2.0四种模式的详解
    查看>>