粘包现象及处理方式
1.客户端接受不及时造成的粘包
server端
import socket
sk=socket.socket()
sk.bind(('127.0.0.1',9003))
sk.listen()
moon,addr=sk.accept()
moon.send("还好吗?".encode())
moon.send("在吗?".encode())
moon.close()
sk.close()
client端
import socket
import time
sk=socket.socket()
sk.connect(('127.0.0.1',9003))
time.sleep(1)
mas=sk.recv(1024).decode()
mgs=sk.recv(1024).decode()
print(mas)
print(mgs)
2.服务端发送的数据短并且连续发送
server端
import socket
sk=socket.socket()
sk.bind(('127.0.0.1',9003))
sk.listen()
moon,addr=sk.accept()
moon.send("还好吗?".encode())
moon.send("在吗?".encode())
moon.close()
sk.close()
client端
import socket
import time
sk=socket.socket()
sk.connect(('127.0.0.1',9003))
for i in range(10000):
i*i
mas=sk.recv(1024).decode()
mgs=sk.recv(1024).decode()
print(mas)
print(mgs)
# 粘包现象
# 当多条消息发送时接受变成了一条或者出现接收不准确的情况
# 粘包现象会发生在发送端
# 两条消息间隔时间短,长度短 就会把两条消息在发送之前就拼在一起
# 节省每一次发送消息回复的网络资源
# 粘包现象会发生在接收端
# 多条消息发送到缓存端,但没有被及时接收,或者接收的长度不足一次发送的长度
# 数据与数据之间没有边界
# 本质 : 发送的每一条数据之间没有边界
粘包的解决方法
server端
import socket
import struct
def dd(mgs):
mgs=mgs.encode()
len1=len(mgs)
len_zj=struct.pack("i",len1)/字节
noom.send(len_zj)
noom.send(mgs)
sk=socket.socket()
sk.bind(('127.0.0.1',9003))
sk.listen()
noom,addr=sk.accept()
mgs1="你好"
mgs2="你也好"
dd(mgs1)
dd(mgs2)
noom.close()
sk.close()
client端
import socket
import struct
import time
def func():
len_zj=sk.recv(4)
len_mgs=struct.unpack("i",len_zj)[0]/元组类型的数(11,)
mgs=sk.recv(len_mgs).decode()
return mgs
sk=socket.socket()
sk.connect(('127.0.0.1',9003))
time.sleep(3)
msg1=func()
msg2=func()
print(msg1)
print(msg2)