zoukankan      html  css  js  c++  java
  • day31 粘包问题

    TCP粘包问题

    cmd客户端代码

    import socket
    import struct
    import socket
    import json
        
    c = socket.socket()
    c.connect(("127.0.0.1",9090))
    while True:
        cmd = input(">>:")
        if not cmd:
            print("命令不能为空")
            continue
        c.send(cmd.encode("utf-8"))
    
        # 1.接收的是额外信息的长度
        length = c.recv(4)
        len_data = struct.unpack("i",length)[0] # 转换为整型
    
        # 2.接收额外信息
        t_data = c.recv(len_data)
        print(t_data.decode("utf-8"))
    
        json_dic = json.loads(t_data.decode("utf-8"))
        print("执行时间:%s" % json_dic["time"])
    
        data_size = json_dic["size"] # 得到数据长度
    
    
        # 3.接收真实数据
        all_data = b"" # 存储已接收数据
        rcv_size = 0 # 已接收长度
        # 接收真实数据
        # 循环接收 直到 接收到的长度等于总长度
        while  rcv_size < data_size:
            data = c.recv(1024)
            rcv_size += len(data)
            all_data += data
    
        print("接收长度%s" % rcv_size)
        print(all_data.decode("gbk"))

    cmd服务端代码

    import  socket
    import subprocess
    import struct
    import datetime
    import json
    
    server = socket.socket()
    server.bind(("127.0.0.1",9090))
    server.listen()
    
    # 要求  不仅返回命令的结果 还要返回执行命令的时间  执行时间:2018/12/26
    
    while True:
        client,addr = server.accept()
        while True:
            try:
                # 接收命令
                cmd = client.recv(1024).decode("utf-8")
                p = subprocess.Popen(cmd,shell=True,stdout=-1,stderr=-1)
                # data与err_data 都是采用的系统编码 windows是GBK
                data = p.stdout.read()
                err_data = p.stderr.read()
    
                print("数据长度:%s" % (len(data)   + len(err_data)))
                # 计算真实数据长度
                length = len(data)   + len(err_data)
    
    
                # 在发送数据之前发送额外的信息
                #t = "{执行时间:%s 真实数据长度:%s" % (datetime.datetime.now(),length)
                # 把要发送的数据先存到字典中
                t = {}
                t["time"] = str(datetime.datetime.now())
                t["size"] = length
                t["filename"] = "a.mp4"
    
    
                t_json = json.dumps(t) # 得到json格式字符串
                t_data = t_json.encode("utf-8") # 将json转成了字节
                t_length = struct.pack("i",len(t_data))
    
    
    
                # 1.先发送额外信息的长度
                client.send(t_length)
                # 2.发送额外信息
                client.send(t_data)
    
                # 3.发送真实数据
                client.send(data)
                client.send(err_data)
            except ConnectionResetError:
                client.close()
                print("连接中断......")
                break
    
    
    #  1.发送了真实数据长度  
    2.发送了额外信息长度 
    3.发送额外信息  
    4.真实数据

    粘包测试

    服务器端
    import  socket
    import subprocess
    
    server = socket.socket()
    server.bind(("127.0.0.1",9090))
    server.listen()
    client,addr = server.accept()
    
    # data =  client.recv(2)
    # print(data.decode("utf-8"))
    # data =  client.recv(2)
    # print(data.decode("utf-8"))
    # data =  client.recv(2)
    # print(data.decode("utf-8"))
    
    data =  client.recv(1024)
    print(data.decode("utf-8"))
    data =  client.recv(1024)
    print(data.decode("utf-8"))
    data =  client.recv(1024)
    print(data.decode("utf-8"))
    
    客户端
    import time
    import socket
    c = socket.socket()
    c.connect(("127.0.0.1",9090))
    
    # c.send("abcdefg".encode("utf-8"))
    c.send("bc".encode("utf-8"))
    # time.sleep(1)
    c.send("ca".encode("utf-8"))
    # time.sleep(1)
    c.send("da".encode("utf-8"))
  • 相关阅读:
    HDU2438:Turn the corner(三分)
    XTU1267:Highway(LCA+树的直径)
    HDU6024:Building Shops(DP)
    “玲珑杯”ACM比赛 Round #13 B -- 我也不是B(二分排序)
    XTU1266:Parentheses(贪心+优先队列)
    Educational Codeforces Round 21 D
    Educational Codeforces Round 21E selling souvenirs (dp)
    EOJ3247:铁路修复计划
    关于工厂模式的 个人理解
    设计模式之 工厂方法
  • 原文地址:https://www.cnblogs.com/shanau2/p/10180190.html
Copyright © 2011-2022 走看看