博客
关于我
【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/

    你可能感兴趣的文章
    Objective-C实现frequency finder频率探测器算法(附完整源码)
    查看>>
    Objective-C实现FTP上传文件(附完整源码)
    查看>>
    Objective-C实现FTP文件上传(附完整源码)
    查看>>
    Objective-C实现FTP文件下载(附完整源码)
    查看>>
    Objective-C实现fuzzy operations模糊运算算法(附完整源码)
    查看>>
    Objective-C实现Gale-Shapley盖尔-沙普利算法(附完整源码)
    查看>>
    Objective-C实现gamma recursive伽玛递归算法(附完整源码)
    查看>>
    Objective-C实现gamma 伽玛功能算法(附完整源码)
    查看>>
    Objective-C实现gauss easte高斯复活节日期算法(附完整源码)
    查看>>
    Objective-C实现gaussian filter高斯滤波器算法(附完整源码)
    查看>>
    Objective-C实现gaussian naive bayes高斯贝叶斯算法(附完整源码)
    查看>>
    Objective-C实现gaussian高斯算法(附完整源码)
    查看>>
    Objective-C实现geometric series几何系列算法(附完整源码)
    查看>>
    Objective-C实现getline函数功能(附完整源码)
    查看>>
    Objective-C实现gnome sortt侏儒排序算法(附完整源码)
    查看>>
    Objective-C实现graph list图列算法(附完整源码)
    查看>>
    Objective-C实现GraphEdge图边算法(附完整源码)
    查看>>
    Objective-C实现GraphVertex图顶点算法(附完整源码)
    查看>>
    Objective-C实现greatest common divisor最大公约数算法(附完整源码)
    查看>>
    Objective-C实现greedy coin change贪心硬币找零算法(附完整源码)
    查看>>