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()


  • 相关阅读:
    SQL Server 2005 数据定义语言触发器(Data Definition Language Triggers)[翻译]
    sqlserver 存储过程例子
    微软CEO鲍尔默:科技产业终将成为经济救世主
    poj:2689用筛选法选素数求区间[L,U]的所有素数
    ZOJ Problem Set 1002 Fire Net
    去除多余括号
    模板元编程:求N的阶乘
    算法导论10.2习题
    奇数阶魔方算法
    TSQL 编程常用例子
  • 原文地址:https://www.cnblogs.com/rainbowupdate/p/12255910.html
Copyright © 2011-2022 走看看