解决粘包问题
要知道!所谓粘包问题主要还是因为接收方不知道消息之间的界限,不知道一次性提取多少字节的数据所造成的。
要解决粘包不外乎一个条件,就是知道取多少,让对方事先知道我们要发多少字节的数据,然后造一个容器,每次规定的往容器里面倒水,当水快满的时候,量出最后一勺还需要多少勺多少的水,最后把这水不多不少的往容器里倒,如果多出来的就往第二个容器里道,粘包就解决了
只能接受一收一发
不能像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)