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

    服务端:

    import socket
    import time
    import subprocess
    import struct
    server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) #可以重复适用系统端口
    server.bind(('192.168.43.14', 9907))
    server.listen(5)
    #第一次

    while True:

    conn, addr = server.accept()
    try:
    while True:
    cmd = conn.recv(1024)
    #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()

    #第一步:制作固定长度的报头
    total_saze = len(stderr) + len(stdout)
    header = struct.pack('i', total_saze)
    #第二步:把数据长度发给客户端
    conn.send(header)


    #第三步:再发送真实数据
    conn.send(stdout)
    conn.send(stderr)
    except ConnectionResetError:
    break
    conn.close()
    server.close()



    #客户端和服务端必须遵循有发就得有收的规律






    客户端:
    import socket
    import time
    import struct
    client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    client.connect(('192.168.43.14', 9907))
    while True:
    cmd = input('请输入你的内容>>>>').strip()
    if not cmd: continue
    client.send(cmd.encode('utf-8'))
    #time.sleep(2)
    #client.send('world'.encode('utf-8'))

    #第一步:先收报头
    header = client.recv(4)

    #第二步:从报头中解析出对真实数据的描述(数据的长度)
    total_saze = struct.unpack('i', header)[0]

    #第三步:接收真实数据
    recv_saze = 0
    recv_data = b''
    while recv_saze < total_saze:
    res = client.recv(1024)
    recv_data+=res
    recv_saze+=len(res)
    #data = client.recv(1024)
    print(recv_data.decode('GBK'))

  • 相关阅读:
    快速幂
    hdu 1595 find the longest of the shortest(迪杰斯特拉,减去一条边,求最大最短路)
    hdu 4121 Xiangqi
    hdu 2224 The shortest path
    hdu4923
    矩阵模板
    hdu4570(区间dp)
    hdu1978(记忆化搜索)
    hdu4283(区间dp)
    hdu1160最长递减子序列及其路径
  • 原文地址:https://www.cnblogs.com/yuexijun/p/11413435.html
Copyright © 2011-2022 走看看