zoukankan      html  css  js  c++  java
  • (9)黏包

    黏包

    # tcp协议在发送数据时,会出现黏包现象.

    (1)数据粘包是因为在客户端/服务器端都会有一个数据缓冲区,

    缓冲区用来临时保存数据,为了保证能够完整的接收到数据,因此缓冲区都会设置的比较大。

    (2)在收发数据频繁时,由于tcp传输消息的无边界,不清楚应该截取多少长度

    导致客户端/服务器端,都有可能把多条数据当成是一条数据进行截取,造成黏包

    黏包出现的两种情况

    #tcp协议:

    优点:接收时数据之间无边界,有可能粘合几条数据成一条数据,造成黏包

    缺点:不限制数据包的大小,稳定传输不丢包

     

    #udp协议:

    优点:接收时候数据之间有边界,传输速度快,不黏包

    缺点:限制数据包的大小(受带宽路由器等因素影响),传输不稳定,可能丢包

     

    #tcp和udp对于数据包来说都可以进行拆包和解包,理论上来讲,无论多大都能分次发送

    但是tcp一旦发送失败,对方无响应(对方无回执),tcp可以选择再发,直到对应响应完毕为止

    而udp一旦发送失败,是不会询问对方是否有响应的,如果数据量过大,易丢包

    解决黏包问题

    #解决黏包场景:

    应用场景在实时通讯时,需要阅读此次发的消息是什么

    #不需要解决黏包场景:

    下载或者上传文件的时候,最后要把包都结合在一起,黏包无所谓.

     

    (1) 服务端

    import time,socket,struct

    # 把当前主机注册到网络

    sk = socket.socket()

    #在bind方法之前加上这句话,可以让一个端口重复使用

    sk.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)

    sk.bind(("127.0.0.1",9001))

    sk.listen()

    conn,addr = sk.accept()

    inp = input(">>>msg:")

    msg = inp.encode("utf-8")

    res = struct.pack("i",len(msg))

    # 发送信息长度 (字节流)

    conn.send(res)

    # 发送用户写的内容

    conn.send(msg)

    # time.sleep(1)

    conn.send("world".encode("utf-8"))

    conn.recv(1024)

    conn.close()

    sk.close()

    (2)客户端

    import time,socket,struct

    sk = socket.socket()

    sk.connect(("127.0.0.1",9001))

    time.sleep(0.1)

    # 是为了接受字符6 #sk.recv(1).decode("utf-8") 字符串

    # n = int(sk.recv(4).decode("utf-8"))

    n = sk.recv(4)

    # 把pack后的数据用unpack进行恢复

    n = struct.unpack("i",n)[0]

    print(n,type(n))

    print(sk.recv(n).decode("utf-8"))

    print(sk.recv(10))

    sk.send(b'hahaha')

    sk.close()

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

     

  • 相关阅读:
    [PAT] 1012 The Best Rank (25 分)Java
    scroll-view 隐藏滚动条
    python bool
    wx小程序 button 属性open-typ 用法 按钮分享
    python str 的常用方法
    node global文件夹和chace文件夹位置全局位置修改
    wx.showModal() 内容如何换行?
    自定义导航栏头部 并简单设置标题和返回按键
    jquery绑定事件如何传递参数
    复习第一天内容
  • 原文地址:https://www.cnblogs.com/lyj910313/p/10787694.html
Copyright © 2011-2022 走看看