zoukankan      html  css  js  c++  java
  • 粘包现象 粘包解决方案

    -------------------------------如果事情无法改变,那就改变自己;如果无法说服他人,那就想法说服自己。如果山过不来,那人就过去!

     # ------------------------------------------------------------------------------------------------------------#
     day 28 今日内容
    粘包现象:
    粘包1:连续的小包,会被优化机制给合并
    粘包2:服务端一次性无法完全就收完客户端发送的数据,第二再次接收的时候,会接收到第一次遗留的内容

    解决粘包的方案:
    方案1:先告诉客户端,数据信息的长度,然后等客户端确认之后,再发送真实内容
    方案2:通过struct模块,将要发送的真实数据的长度进行打包,打包成4个字节,和真实数据一起一次性发送个客户端.客户端取出前4个字节,通过struct解包获得后面真实数据的长度,根据这个长度再进行数据的接受
    合法性链接验证


    明日预习:
    Socketserver
    # # --------------[粘包方案解决-客户端]--------------
    import json
    import socket
    import struct
    client = socket.socket()
    ip_port = ('127.0.0.1',8001)
    client.connect(ip_port)
    all_recv_len = 0
    all_data_byte = b''

    while 1:
    client_cmd = input('请输入系统指令>>>')
    client.send(client_cmd.encode('utf-8'))
    #先接收4个字节,这4个字节是真实数据长度加工成的
    recv_data_len = client.recv(4)
    #将4个字节长度的数据,解包成后面真实数据的长度
    real_data_len = struct.unpack('i',recv_data_len)[0]

    print(real_data_len)

    server_result = client.recv(real_data_len)

    print(server_result.decode('gbk'))
    
    
    # # --------------[粘包方案解决-服务端]--------------
    import socket
    import subprocess
    import struct
    server = socket.socket()
    ip_port = ('127.0.0.1',8001)
    data_full_len = 0 #统计发送数据的长度
    server.bind(ip_port)
    server.listen()
    conn,addr = server.accept()
    while 1:
    from_client_cmd = conn.recv(1024).decode('utf-8')

    sub_obj = subprocess.Popen(
    from_client_cmd,
    shell=True,
    stdout=subprocess.PIPE,
    stderr=subprocess.PIPE,
    )
    #subprocess对象.read 得到的结果是bytes类型的
    cmd_res = sub_obj.stdout.read()
    data_len = len(cmd_res) #总数据长度
    data_len_str = str(data_len)
    print('结果长度>>>',data_len)

    #将真实数据长度打包成4个字节的数据
    struct_data_len = struct.pack('i',data_len)

    conn.send(struct_data_len + cmd_res)


    今日作业
    1、什么缓冲区,为什么会有缓冲区?

    2、写一个tcp写一下的socket对话程序,能够优雅的断开,让另外一个客户端连接上进行收发消息。

    3、自行完成今天课上写的使用subprocess进行系统调用的对话方式,客户端发送指令,服务端执行指令并且将结果返回给客户端,确保不产生粘包

    4、什么是粘包? socket 中造成粘包的原因是什么? 哪些情况会发生粘包现象?

    5、用tcp协议下的socket,写一个简易的文件上传下载的功能,用户需要登陆认证,认证成功后,客户端用户可以选择上传或者是下载,
    上传的时候服务端提前设定好上传文件的路径,将文件上传到对应的路径下,下载文件的时候,服务端将之前设定好的上传路径中的所有
    文件带上序号展示给用户看,用户输入文件序号后下载对应的文件,文件下载到客户端程序的当前路径下就可以了。
  • 相关阅读:
    bzoj4152 [AMPPZ2014]The Captain
    bzoj2429 [HAOI2006]聪明的猴子
    bzoj1196 [HNOI2006]公路修建问题
    bzoj1083 [SCOI2005]繁忙的都市
    bzoj1050 [HAOI2006]旅行comf
    bzoj1088 [SCOI2005]扫雷Mine
    bzoj1085 [SCOI2005]骑士精神
    bzoj3437 小P的牧场
    bzoj1296 [SCOI2009]粉刷匠
    A1046 Shortest Distance (20)(20 分)
  • 原文地址:https://www.cnblogs.com/dealdwong2018/p/10009456.html
Copyright © 2011-2022 走看看