粘包现象及处理方式

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)
posted @ 2019-09-24 15:36  风景!  阅读(311)  评论(0编辑  收藏  举报