成都 网站建设培训,如何建设一个读书的网站,旅游区网站开发,老哥们给个uc能看的立即学习:https://edu.csdn.net/course/play/24458/296241?utm_sourceblogtoedu1.send和recv底层分析 1#xff09;不管是recv还是send都不是直接接收对方数据或者发送给对方数据#xff0c;而是对自己的操作系统内存进行操作#xff1b; 2#xff09;客户端与服务端并不是…立即学习:https://edu.csdn.net/course/play/24458/296241?utm_sourceblogtoedu1.send和recv底层分析 1不管是recv还是send都不是直接接收对方数据或者发送给对方数据而是对自己的操作系统内存进行操作 2客户端与服务端并不是一个send对于一个recv 3send过程分析此处以客户端向服务端发送数据为例 #1.客户端将数据发送给自己的操作系统即将数据给操作系统内存这样就算是结束了send这个命令而至于怎么将数据发送给服务端由客户端的操作系统决定 #2.send需要经历的阶段产生数据——将数据copy给客户端自己的操作系统内存 4recv过程分析以服务端接收客户端数据为例 #1.服务端首先是等待客户端的数据然后接收数据即可 #2.recv经历的阶段wait data耗时较长——copy data首先是客户端的操作系统内存的数据通过网关发送给服务端的操作系统内存然后再由服务端的程序从自身的操作系统内存中copy data再进行执行这就完成recv的过程 2.粘包产生的原因由TCP协议中的优化算法nagle算法决定的。TCP协议存在的问题在UDP协议中不会出现这种问题 1产生粘包的条件数据小且两次或多次发送数据的间隔小的情况下会产生粘包现象所以使用TCP协议不是一定会发生粘包只有满足条件才会 2在TCP协议中send是一条一条消息地发送数据而recv却可以一次性接收多条消息发送的数据即接收到的数据是一个整体因为在时间间隔较短的时间内发送的小数据会在客户端的操作系统内存中会被合并成一个数据包再发送给服务端的操作系统内存因此无法判断出哪些数据是哪条消息的TCP时面向流的 3TCP是面向流的为了减少IO传输
的次数进而增加传输数据的效率采用了nagle算法将间隔时间短的小数据合并成一个大的数据块进行接收处理然后将处理后的大的数据块返回给客户端而客户端无法识别出哪些数据是哪条信息的故产生了粘包 4在客户端粘包的情况,在客户端时间间隔短的情况下发送两次数据导致客户端发送的数据产生粘包现象
#客户端产生粘包的情况
客户端import socket
phone socket.socket((socket.AF_INET,socket.SOCK_STREAM))
phone.connect((127.0.0.1,8080))
phone.send(hello)
phone.send(world)
服务端import socket
phone socket.socket((socket.AF_INET,socket.SOCK_STREAM))
phone.bind((127.0.0.1,8080))
conn,client phone.accept()res1 conn.recv(1024)
#bhelloworld
print(第一次接收的数据,res1)res2 phone.recv(1024)
#b
print(第二次接收的数据res2)#客户端不存在粘包的现象只需要在客户端的两次send之间加入一个time.sleep(2)即可即破坏粘包产生的条件之一间隔时间短的情况下发送多次数据4服务端产生粘包现象
#客户端
......
phone.send(hello.encode(utf-8))
time.sleep(5)
phone.send(world.encode(utf-8))
......#服务端
......
res1 conn.recv(1)
#bh
print(第一次接收的数据res1)
time.sleep(6)#服务器端比客户端多睡一秒钟因此上一次的发送的未接收的数据‘ello’会和这次发送的world在服务器端的操作系统内存中合并在一起
res2 conn.recv(1024)
#belloworld
print(第二次接收的数据res2)
注上述只是便于理解才用time.sleep来解决粘包实际上是非常不支持这样来解决粘包问题