解决粘包问题

解决粘包问题

要知道!所谓粘包问题主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的。

要解决粘包不外乎一个条件,就是知道取多少,让对方事先知道我们要发多少字节的数据,然后造一个容器,每次规定的往容器里面倒水,当水快满的时候,量出最后一勺还需要多少勺多少的水,最后把这水不多不少的往容器里倒,如果多出来的就往第二个容器里道,粘包就解决了

 

只能接受一收一发 

不能像UDP一样发完 可以继续发

from socket import *
import struct,json

ip_port=('127.0.0.1',8080)
client=socket(AF_INET,SOCK_STREAM)
client.connect(ip_port)

while True:
    cmd=input('>>: ')
    if not cmd:continue
    client.send(bytes(cmd,encoding='utf-8'))

    head=client.recv(4)
    head_json_len=struct.unpack('i',head)[0]
    head_json=json.loads(client.recv(head_json_len).decode('utf-8'))
    data_len=head_json['data_size']

    recv_size=0
    recv_data=b''
    while recv_size < data_len:
        recv_data+=client.recv(1024)
        recv_size+=len(recv_data)

    print(recv_data.decode('utf-8'))
    #print(recv_data.decode('gbk')) #windows默认gbk编码

 

#服务端
# import socket
# server=socket.socket()
# ADDR = ("192.168.11.175",8080)
# server.connect(ADDR)
#
# server.send("Wo Shi Diao Bao Xia !!".encode())
# feedback=server.recv(1024)                           #收消息,听话
# print(feedback.decode('utf-8'))
# input("")
# server.close()

import socket,subprocess
import struct
server=socket.socket(socket.AF_INET,socket.SOCK_STREAM)
server.bind(("127.0.0.1",8081))
server.listen(5)
while True :
    coon,addr=server.accept()
    while True:
        try:
     
            msg=coon.recv(1024).decode()
            if not msg :break
            with open(msg,"rb") as r :
                data=r.read()
            data_len=struct.pack("i",len(data))
            print(">>>2")
            coon.send(data_len)
            coon.send(data)
        except Exception as f :
            print(f)



 

你可能感兴趣的:(解决粘包问题)