第31篇 粘包的产生原理 以及如何解决粘包问题

内容回顾:    如何与另外一台电脑连接:        ping 对方的ip地址    如何参电脑的ip配置        cmd-->ipconfig

内容概览:    粘包问题    粘包产生原理    如何解决粘包问题

粘包的产生:

#server
import  socket
sk = socket.socket()
ip_port = (‘127.0.0.1‘,8989)
sk.bind(ip_port)
sk.listen()
conn,addr = sk.accept()
conn.send(b‘hello,‘)
conn.send(b‘world‘)
conn.close()
sk.close()

  


#client
import socket
sk = socket.socket()
ip_port = (‘127.0.0.1‘,8989)
sk.connect(ip_port)
ret1 = sk.recv(2)
print(ret1)
ret2 = sk.recv(1024)
print(ret2)
sk.close()

  


#client端收到的结果
b‘he‘
b‘llo,‘

  


什么是粘包?    数据之间没有分界线,导致两个数据粘合在一起,被接收端接收的现象,就叫做粘包-------------插入图片————————粘包产生的原因:    发送端将两个挨得很近的数据,发送出去,在本地的缓存区粘合在一起,传输给对方,    对方接收到数据之后,由于数据没有界限,于是将两个粘合在一起的数据一起接收。合包现象:    数据很短    时间间隔很近

拆包现象:    大数据在传输的过程中会发生拆包现象    不会一次性的将数据全部发送给对方    对方接收的时候很可能没有办法一次性接收所有的信息    对方一次没有接收完的信息,会与后面的信息粘在一起

粘包现象只会发生在TCP协议    TCP的协议是流式传输    每一条信息与信息之间是没有界限的

UDP协议中是不会发生粘包的    UDP协议适合短数据的发送    不建议发送过程的信息    数据越长,传输逇过程中,会越容易丢失

解决粘包问题的初探:    能否在发送信息的时候把信息的长度一起发送,接收方根据长度来截取信息。

#server
import  socket
sk = socket.socket()
ip_port = (‘127.0.0.1‘,8989)
sk.bind(ip_port)
sk.listen()

conn,addr = sk.accept()
conn.send(b‘0011hello,zhuge‘)
conn.send(b‘0005world‘)

conn.close()
sk.close()

  


#client
import socket
sk = socket.socket()
ip_port = (‘127.0.0.1‘,8989)
sk.connect(ip_port)

ret1 = sk.recv(4)
len1 = int(ret1.decode(‘utf-8‘))
ret2 = sk.recv(len1)
print(ret2.decode(‘utf-8‘))

ret3 = sk.recv(4)
len2 = int(ret3.decode(‘utf-8‘))
ret4 = sk.recv(len2)
print(ret4.decode(‘utf-8‘))

sk.close()

  


#client显示结果:
hello,zhuge
world

  


总结一下:    上面的办法虽然解决了问题但是存在漏洞,要是长度超过9999就不好使了。    有没有一种算法,输入任意长的数字,得到的是一个四位数,    这个四位数,被接收之后,又可以根据算法反推出这个任意长的数是多少,那么问题就解决了。

struck模块

#server端
conn,addr = sk.accept()
while True:
    s = input(‘>>>‘).encode(‘utf-8‘)
    pack_num = struct.pack(‘i‘,len(s))#s的长度转化成一个4位数
    conn.send(pack_num)
    conn.send(s)

conn.close()
sk.close()

  


#client端
import socket
import struct
sk = socket.socket()
ip_port = (‘127.0.0.1‘,8989)
sk.connect(ip_port)

while True:
    pack_num = sk.recv(4)
    num = struct.unpack(‘i‘,pack_num)[0]#这里有个坑,得到的是元组,(10,)
    ret = sk.recv(num)
    print(ret.decode(‘utf-8‘))

sk.close()

  



原文地址:https://www.cnblogs.com/cavalier-chen/p/9649078.html

时间: 2024-08-14 08:43:09

第31篇 粘包的产生原理 以及如何解决粘包问题的相关文章

Python网络编程04/recv原理/高大上版解决粘包方式

目录 Python网络编程04/recv原理/高大上版解决粘包方式 1.昨日内容回顾 2.recv工作原理 3.高大上版解决粘包方式(自定制报头) 3.1 解决思路: 3.2 服务端 3.3客户端 4.基于UDP协议的socket通信 4.1服务端 4.2客户端 Python网络编程04/recv原理/高大上版解决粘包方式 1.昨日内容回顾 1. 通信循环 2. 链接通信循环 3. 远程执行命令: subprocess.Popen() # bytes: 网络传输, 文件存储时. 4. 粘包现象

(入门篇 NettyNIO开发指南)第四章-TIP黏包/拆包问题解决之道

熟悉TCP编程的读者可能都知道,无论是服务端还是客户端,当我们读取或者发送消息的时候,都需要考虑TCP底层的粘包/拆包机制.木章开始我们先简单介绍TCP粘包/拆包的基础知识,然后模拟一个没有考虑TCP粘包/拆包导致功能异常的案例,最后通过正确例米探讨Netty是如何解决这个问题的.如果你已经熟悉了TCP粘包和拆包的相知识,建议你直接跳到代码讲解小节,看Netty是如何解决这个问题的.本章主要内容包: TCP粘包/拆包的基础知识 没考虑TCP粘包/拆包的问题案例 使用Netty解决读半包问题 4.

解决粘包和拆包问题

解决粘包和拆包问题 上一篇我们介绍了如果使用Netty来开发一个简单的服务端和客户端,接下来我们来讨论如何使用解码器来解决TCP的粘包和拆包问题 我们知道,TCP是以一种流的方式来进行网络转播的,当tcp三次握手简历通信后,客户端服务端之间就建立了一种通讯管道,我们可以想象成自来水管道,流出来的水是连城一片的,是没有分界线的. TCP底层并不了解上层的业务数据的具体含义,它会根据TCP缓冲区的实际情况进行包的划分. 所以对于我们应用层而言.我们直观是发送一个个连续完整TCP数据包的,而在底层就可

用readn与written实现解决粘包问题

总结一些我们在平时使用vim编辑器的一些实用功能,后续会一直更新. 1.  visual插件 visual插件其实相当于一个书签作用,比如我们在一篇很长的源代码文件中,我们可以标记一行,然后后来我们再想回到这一行时,只需要一个快捷键就能迅速定位到这一行,非常方便,不用不停地往上或往下翻. 1.1  常用命令 1.  mm标记一个标签: 2.  F2回到被标记的那一行: 3.  连续按两次mm就可以取消标签: 4.  shift+F2可以在几个标签来回切换: 2.  emmet.vim插件 emm

《连载 | 物联网框架ServerSuperIO教程》- 9. 协议过滤器,解决一包多发、粘包、冗余数据

感谢唯笑志在分享 原博主原地址:http://www.cnblogs.com/lsjwq/ 目       录 9. 协议过滤器,解决一包多发.粘包.冗余数据... 2 9.1  概述... 2 9.2 实际问题... 2 9.3 5种过滤器及二次开发... 5 9.4 设备驱动开发注意事项... 6 9.5 宿主程序服务实例配置注意事项... 6 9. 协议过滤器,解决一包多发.粘包.冗余数据    9.1    概述 通讯中涉及到数据包的概念,是通讯协议中的数据组成形式.针对这块内容,说简单

Android中插件开发篇之----应用换肤原理解析

一.前言 今天又到周末了,感觉时间过的很快呀.又要写blog了.那么今天就来看看应用的换肤原理解析.在之前的一篇博客中我说道了Android中的插件开发篇的基础:类加载器的相关知识.没看过的同学可以转战: http://blog.csdn.net/jiangwei0910410003/article/details/41384667 二.原理介绍 现在市场上有很多应用都有换肤的功能,就是能够提供给用户一些皮肤包,然后下载,替换.而且有些皮肤是要收费的.对于这个功能的话,其实没有什么技术难度的,但

[编织消息框架][设计协议]解决粘包半包(下)

接下来介绍netty如何切割分包 学习目的,了解处理业务,方便以后脱离依赖 读者如果不感兴趣或看不懂可以先忽略,难度比较大 LengthFieldBasedFrameDecoder.class public LengthFieldBasedFrameDecoder( ByteOrder byteOrder, //大小端模式 默认大端 ByteOrder BIG_ENDIAN int maxFrameLength, //包Frame netty叫帧概念 最大上限 int lengthFieldOf

c# socket 解决粘包,半包

处理原理: 半包:即一条消息底层分几次发送,先有个头包读取整条消息的长度,当不满足长度时,将消息临时缓存起来,直到满足长度再解码 粘包:两条完整/不完整消息粘在一起,一般是解码完上一条消息,然后再判断是否有剩余字节,有的话缓存起来,循环半包处理 客户端接收代码: private void callReceived(object sender, SocketAsyncEventArgs args) { var socket = sender as Socket; var bb = args.Use

建议程序员都读一读的31篇论文系列笔记(1~2)

序:前几日网上偶尔看到"程序员必读论文系列",顺便搜了一下,发现有多个版本共31篇,不过看起来都不错,故准备花时间都读一下,可以拓宽下视野.来源论文题目主要参考 http://blog.csdn.net/turingbook/article/details/3946421 和 http://top.jobbole.com/17733/ .每读完一篇论文就写些笔记,或长或短,也就是这几篇文章的由来. 1. An Axiomatic Basis for Computer Programmi