博客
关于我
【Python】网络编程--解决粘包问题--简单版:
阅读量:366 次
发布时间:2019-03-04

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

网络编程解决粘包问题——简单版

1. 服务端启动

服务端启动时,首先需要绑定指定的IP地址和端口号。这里使用的端口号是9909。服务端需要监听客户端的连接请求,并准备接收客户端发送的命令。

import socketimport subprocessimport structphone = socket.socket(socket.AF_INET, socket.SOCK_STREAM)phone.bind(('127.0.0.1', 9909))phone.listen(5)print('starting...')

2. 接收客户端连接

服务端进入监听模式后,会等待客户端的连接请求。一旦有客户端连接,服务端就会接收并处理客户端发送的命令。

while True:    conn, client_addr = phone.accept()    print(f'连接来自:{client_addr}')    while True:        try:            # 接收命令            cmd = conn.recv(8096)            if not cmd:                break            # 执行命令并获取结果            obj = subprocess.Popen(                cmd.decode('utf-8'),                shell=True,                stdout=subprocess.PIPE,                stderr=subprocess.PIPE            )            stdout = obj.stdout.read()            stderr = obj.stderr.read()            # preparing header            total_size = len(stdout) + len(stderr)            header = struct.pack('i', total_size)            # 发送结果            conn.send(header)            conn.send(stdout)            conn.send(stderr)        except ConnectionResetError:            break        conn.close()

3. 客户端发送命令

客户端通过socket连接到服务端,发送命令并接收结果。客户端需要处理报头和真实数据。

import 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 = phone.recv(4)    total_size = struct.unpack('i', header)[0]    recv_size = 0    recv_data = b''    while recv_size < total_size:        recv_data += phone.recv( total_size - recv_size )        recv_size += len(recv_data)

4. 数据传输流程

  • 客户端发送命令:通过socket发送命令字符串。
  • 服务端接收命令:服务端接收命令并执行。
  • 服务端准备结果:将执行结果的标准输出和标准错误分别读取,并打包成固定长度的报头。
  • 发送结果:服务端先发送报头,再发送标准输出和标准错误。
  • 这种方式可以确保客户端能够准确接收服务端返回的完整数据,避免因传输过程中的丢包导致的数据错误。

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

    你可能感兴趣的文章
    npm run dev 报错PS ‘vite‘ 不是内部或外部命令,也不是可运行的程序或批处理文件。
    查看>>
    npm scripts 使用指南
    查看>>
    npm should be run outside of the node repl, in your normal shell
    查看>>
    npm start运行了什么
    查看>>
    npm WARN deprecated core-js@2.6.12 core-js@<3.3 is no longer maintained and not recommended for usa
    查看>>
    npm 下载依赖慢的解决方案(亲测有效)
    查看>>
    npm 安装依赖过程中报错:Error: Can‘t find Python executable “python“, you can set the PYTHON env variable
    查看>>
    npm.taobao.org 淘宝 npm 镜像证书过期?这样解决!
    查看>>
    npm—小记
    查看>>
    npm上传自己的项目
    查看>>
    npm介绍以及常用命令
    查看>>
    NPM使用前设置和升级
    查看>>
    npm入门,这篇就够了
    查看>>
    npm切换到淘宝源
    查看>>
    npm切换源淘宝源的两种方法
    查看>>
    npm前端包管理工具简介---npm工作笔记001
    查看>>
    npm包管理深度探索:从基础到进阶全面教程!
    查看>>
    npm升级以及使用淘宝npm镜像
    查看>>
    npm发布包--所遇到的问题
    查看>>
    npm发布自己的组件UI包(详细步骤,图文并茂)
    查看>>