zoukankan      html  css  js  c++  java
  • 造成黏包的原因,及解决方案

    什么原因导致的黏包?

      tcp协议的流失传输造成的黏包。

    黏包:

      (自定义协议)先发送数据长度,再发送数据。

    基于tcp先执行一个远程行命令的程序:

    subprocess模块:

    import subprocess
    res=subprocess.Popen("dir",
                         shell=True,  #  终端错误
                         stderr=subprocess.PIPE,  #标准    错误
                         stdout=subprocess.PIPE  #终端标准输出
    
                         )
    print(res.stdout.read().decode("gbk"))
    查看在当前目录下的所有内容
    程序的结果的编码是以当前所在的系统为准的,Windows,res.stdout.read()读出来的是gbk,在接收端使用gbk解码,且只能从管道里读取一次结果
    注意:
      同时执行多条命令后,得到的结果很可能是一部分;(1024),因为在执行其他命令的时候又接收之前执行的另一部分结果,这种现象就是黏包

    tcp 和udp的区别?

      tcp:可靠的(保证对方能收到消息),面向连接的,全双工的流式传输,效率比较低。

      udp:不可靠,效率高,是无连接的,基于数据包传输而传输数据,但是传输的数据长度有限制。

    注意:只有tcp有黏包现象,udp永远不会黏包。

    黏包的解决方法?

      使用struct解决黏包,借助struct模块,长度数字可以被转换成一个标准大小的4字节数字,因此可以利用这个特点来预先发送数据长度。

    发送时 接收时
    先发送struct转换好的数据长度4字节   先接收4个字节使用struct转换成数字来获取要接收的数据长度
    再次发送 再按照长度接收数据
  • 相关阅读:
    mac 终端 常用命令
    创办支持多种屏幕尺寸的Android应用
    java学习之部分笔记2
    java学习之部分笔记
    java学习之i/o
    java中String的用法
    java中List的用法
    java学习之Date的使用
    java学习之数据库
    C#中通过类来继承两个接口,父类实例化接口中的方法,子类继承父类,调用方法
  • 原文地址:https://www.cnblogs.com/wqzn/p/9588041.html
Copyright © 2011-2022 走看看