码迷,mamicode.com
首页 > 其他好文 > 详细

粘包2

时间:2020-03-20 00:38:58      阅读:61      评论:0      收藏:0      [点我收藏+]

标签:str   系统   就是   serve   code   accept   发送   tcp   div   

客户端

 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(bhello, (127.0.0.1, 8080))
5 udp_client.sendto(bworld, (127.0.0.1, 8080))
6 udp_client.sendto(begon, (127.0.0.1, 8080))

原因:udp是基于数据报的工作方式工作的    一个包就是一个包,操作系统不会把多个包进行合并

udp   一发一收

粘包2

标签:str   系统   就是   serve   code   accept   发送   tcp   div   

原文地址:https://www.cnblogs.com/ch2020/p/12528378.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!