zoukankan      html  css  js  c++  java
  • 解决粘包-简单版本

    服务端:
    import socket
    import subprocess
    import struct
    #简易版缺点:struct 的数据i需要在4以内,如果发送的数据较大,会超过I,无法发送。因此需要优化
    #创建套接字
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server.bind(('192.168.43.177',8093))
    server.listen(5)

    while True:
    conn,addr = server.accept()
    while True:
    try:
    cmd = conn.recv(8086)
    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()
    #3.把命令的结果返回给客户端
    #第一步:制作固定长度的报头
    total_size = len(stdout)+len(stderr)
    header = struct.pack('i',total_size)
    print(stdout)
    conn.send(header)
    #发送具体内容
    conn.send(stdout)
    conn.send(stderr)
    except ConnectionResetError:
    break
    conn.close()
    server.close()


    客户端:

    import socket
    import subprocess
    import struct
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server.connect(('192.168.43.177',8093))

    while True:
    #1.发命令
    cmd = input('>>:').strip()
    if not cmd :continue
    server.send(cmd.encode('utf-8'))
    #2.拿命令的结果,并打印
    # 第一步:先收报头
    header = server.recv(4)
    #第二步:从报头中解析出对真实数据描述
    total_size = struct.unpack('i',header)[0]
    #第三步:接收真实数据
    recv_size = 0
    recv_data = b''
    print(total_size)
    while recv_size < total_size:
    res = server.recv(1024)
    recv_data += res
    recv_size += len(res)

    print(recv_data.decode('gbk'))
    # res1= server.recv(1024)
    # print(res1.decode('gbk'))
    server.close()


  • 相关阅读:
    binutils工具集之---objcopy,ranlib,size,strings,strip
    FreeRtos——多任务
    IntelliJ Idea 常用快捷键
    了解Spring-boot-starter常用依赖模块
    Spring Boot项目的内嵌容器
    Spring Boot 简介
    webstorm的个性化设置settings
    webstorm使用心得
    webstorm快捷键
    WebStorm使用快速入门
  • 原文地址:https://www.cnblogs.com/rainbowupdate/p/12255910.html
Copyright © 2011-2022 走看看