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

    你可能感兴趣的文章
    Vue踩坑笔记 - 关于vue静态资源引入的问题
    查看>>
    Netty工作笔记0025---SocketChannel API
    查看>>
    Netty工作笔记0027---NIO 网络编程应用--群聊系统2--服务器编写2
    查看>>
    Netty工作笔记0050---Netty核心模块1
    查看>>
    Netty工作笔记0060---Tcp长连接和短连接_Http长连接和短连接_UDP长连接和短连接
    查看>>
    Netty工作笔记0077---handler链调用机制实例4
    查看>>
    Netty工作笔记0084---通过自定义协议解决粘包拆包问题2
    查看>>
    Netty常见组件二
    查看>>
    netty底层源码探究:启动流程;EventLoop中的selector、线程、任务队列;监听处理accept、read事件流程;
    查看>>
    Netty核心模块组件
    查看>>
    Netty框架的服务端开发中创建EventLoopGroup对象时线程数量源码解析
    查看>>
    Netty源码—2.Reactor线程模型一
    查看>>
    Netty源码—4.客户端接入流程一
    查看>>
    Netty源码—4.客户端接入流程二
    查看>>
    Netty源码—5.Pipeline和Handler一
    查看>>
    Netty源码—6.ByteBuf原理二
    查看>>
    Netty源码—7.ByteBuf原理三
    查看>>
    Netty源码—7.ByteBuf原理四
    查看>>
    Netty源码—8.编解码原理二
    查看>>
    Netty源码解读
    查看>>