客户端代码
import socket #网路编程模块
import struct #把2的32次方的位的正反数组封装成4个字节的模块
sk=socket.socket() #创建对象
import os
sk.connect(("127.0.0.1",80))#连接服务端
filepath="./SQLyog.7z" #路径
ll=os.path.getsize(filepath)#得到文件的总大小
bln=struct.pack("i",ll) #返回一个4个字节的bytes类型的数据
sk.send(bln)#发送这个数据
with open(filepath,mode="rb") as f:
for i in f:
sk.send(i)
#测试是否粘包
sk.send("太好了".encode("utf8"))
sk.close()
服务器端代码
import socket
import struct
sk=socket.socket()#创建对象
sk.bind(("127.0.0.1",80))#绑定ip和端口
sk.listen() #监听端口
conn,dr=sk.accept()#创建连接
msg=conn.recv(4) #接受客户端发送的4个字节的数据
ms=struct.unpack("i",msg)[0] #把得到的4个字节的数据还原成原来的样子
print(ms)#得到总大小
with open("S1QL12.7z", mode="ab") as f:
while ms>0: #判断是符大于0
content = conn.recv(1024) #每次都读1024个字节
ms -= len(content) #拿总大小减去已经读取的大小
f.write(content) #写入文件
msg=conn.recv(1024).decode("utf8") #测试能得到数据吗,要是可以就不会出现粘包现象
print(msg)#得到数据
conn.close()#关闭连接
sk.close()