粘包2
Posted ch2020
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了粘包2相关的知识,希望对你有一定的参考价值。
客户端
1 from socket import * 2 3 tcp_server = socket(AF_INET, SOCK_STREAM) 4 tcp_server.bind((‘127.0.0.1‘, 8080)) 5 tcp_server.listen(124) 6 coon, addr = tcp_server.accept() 7 data1 = coon.recv(1024) 8 print(‘第一次收‘, data1.decode()) 9 10 data2 = coon.recv(1024) 11 print(‘第二次收‘, data2.decode()) 12 13 data3 = coon.recv(1024) 14 print(‘第三次收‘, data3.decode())
服务端
1 from socket import * 2 3 tcp_client = socket(AF_INET,SOCK_STREAM) 4 tcp_client.connect((‘127.0.0.1‘,8080)) 5 tcp_client.send(‘hello‘.encode()) 6 tcp_client.send(‘world‘.encode()) 7 tcp_client.send(‘中国‘.encode()) # 套接字没有规定一发一收 8 # 套接字都是往缓冲区中发
运行可知,tcp协议:当发送接收数据时,如果发送的数据包很小,操作系统会将多个小的数据包合并发送。接收方就一次接受所有的数据包。
这个原理就是Nagle算法。
下面是发送的数据量小的一种情况:
用了时间模块后,发现这个是由系统决定的。
第二种情况,发送的数据量大的情况:服务端:
1 from socket import * 2 3 udp_server = socket(AF_INET, SOCK_DGRAM) 4 udp_server.bind((‘127.0.0.1‘, 8080)) 5 data = udp_server.recvfrom(1024) # 哪怕是发送了很多个包在缓冲区,但是一次接受只能接受一个包 6 print(‘收到的数据包为:‘, data)
客户端:
1 from socket import * 2 3 udp_client = socket(AF_INET, SOCK_DGRAM) 4 udp_client.sendto(b‘hello‘, (‘127.0.0.1‘, 8080)) 5 udp_client.sendto(b‘world‘, (‘127.0.0.1‘, 8080)) 6 udp_client.sendto(b‘egon‘, (‘127.0.0.1‘, 8080))
原因:udp是基于数据报的工作方式工作的 一个包就是一个包,操作系统不会把多个包进行合并
udp 一发一收
以上是关于粘包2的主要内容,如果未能解决你的问题,请参考以下文章