天道酬勤,学无止境

粘包

解决粘包问题

目录一、解决粘包问题(low版)1.1 服务端1.2 客户端1.3 为何low二、补充struct模块2.1 简单使用三、解决粘包问题(Nick版)3.1 使用struct模块创建报头3.2 服务端3.3 客户端四、TCP协议粘包问题分析4.1 服务端4.2 客户端4.3 服务端4.4 客户端一、解决粘包问题(low版)问题的根源在于,接收端不知道发送端将要传送的字节流的长度,所以解决粘包的方法就是围绕,如何让发送端在发送数据前,把自己将要发送的字节流总大小让接收端知晓,然后接收端来一个死循环接收完所有数据。1.1 服务端import socket, subprocess server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) server.bind(('127.0.0.1', 8000)) server.listen(5) while True: conn, addr = server.accept() print('start...') while True: cmd = conn.recv(1024) print('cmd:', cmd) obj = subprocess.Popen(cmd.decode('utf8'), shell=True, stderr=subprocess.PIPE, stdout

2021-04-19 19:59:56    分类:博客    粘包

粘包问题

目录一、什么是粘包?二、TCP发送数据的四种情况三、粘包的两种情况3.1 服务端3.2 客户端3.3 服务端3.4 客户端四、补充问题一:为何TCP是可靠传输,udp是不可靠传输五、补充问题二:send(字节流)和recv(1024)及sendall一、什么是粘包?注意:只有TCP有粘包现象,UDP永远不会粘包,为何,且听我娓娓道来。首先需要掌握一个socket收发消息的原理发送端可以是一K一K地发送数据,而接收端的应用程序可以两K两K地提走数据,当然也有可能一次提走3K或6K数据,或者一次只提走几个字节的数据,也就是说,应用程序所看到的数据是一个整体,或说是一个流(stream),一条消息有多少字节对应用程序是不可见的,因此TCP协议是面向流的协议,这也是容易出现粘包问题的原因。而UDP是面向消息的协议,每个UDP段都是一条消息,应用程序必须以消息为单位提取数据,不能一次提取任意字节的数据,这一点和TCP是很不同的。怎样定义消息呢?可以认为对方一次性write/send的数据为一个消息,需要明白的是当对方send一条信息的时候,无论底层怎样分段分片,TCP协议层会把构成整条消息的数据段排序完成后才呈现在内核缓冲区。例如基于TCP的套接字客户端往服务端上传文件,发送时文件内容是按照一段一段的字节流发送的,在接收方看了,根本不知道该文件的字节流从何处开始,在何处结束

2021-04-19 19:59:43    分类:博客    粘包