设计思路
运行思路如下
- 先导入socket模块,指定发送端的ip和端口号,并通过server.bind进行连接(必须是元组形式),然后通过server.accept()来接收客户连接,这时候就需要通过服务器端来进行响应了,响应的话也需要指定发送端的ip和端口号(与发送端同步),然后通过创建txt文档并通过while循环写入到文档中,判断依据是只要字节不为0,就一直传。
- 如果需要传汉字,那么就应该构建一个json文件在传
- 参考文章
代码实现
#===============================================================
# 客户端
import socket
import os
import json
def file_put(filedir):
ip_addr=("10.16.55.26",9999)
client=socket.socket() #创建套接字对象
client.connect(ip_addr) #绑定IP地址和端口,必须是元组形式
print('connect success.....')
if os.path.isfile(filedir):
print('the file path is {}'.format(filedir))
file_name = filedir #指定文件名称
file_size = os.stat(file_name).st_size #计算文件大小
file_msg = {"action":"put","name":file_name,"size":file_size} #构建一个json文件
client.send(bytes(json.dumps(file_msg),encoding="utf-8")) #发送传输需要的数据
print("文件名: %s --> 文件大小: %s "%(file_name,file_size))
with open(file_name,"rb") as f:
for line in f:
client.send(line) #开始发送数据
print("文件已发送: %s" % len(line))
print("文件发送完成...")
else:
print('please check your file path,the file path {} is not exist'.format(file_path))
if __name__ == '__main__':
for i in range(1,3):
out_emb_path='/home/z/Documents/face_detect_yolov4_yolov4tiny_ssd-master/tools/yoloface_hkcamera{}_arcface_feature.pkl'.format(i)
print(out_emb_path)
file_put(out_emb_path) #调用函数,传输文件
#===============================================================
# 服务端
import socket
import json,os
ip_addr=("10.16.55.26",9999)
server=socket.socket()
server.bind(ip_addr)
server.listen(5)
print('waiting for file...')
while True:
conn,addr=server.accept()
file_msg=conn.recv(1024)
msg_data = json.loads(file_msg)
if msg_data.get("action") == "put": #是PUT则执行上传
file_name = msg_data.get("name")
(filepath,tempfilename)=os.path.split(file_name)
if file_name:
new_file_name='F:/pycharm/feature_match/receive_file/'+tempfilename
file_size = msg_data.get("size")
recv_size = 0
with open(new_file_name, "wb") as f:
while recv_size != file_size:
data = conn.recv(1024)
f.write(data)
recv_size += len(data)
print("文件大小: %s 传输大小: %s" % (file_size, recv_size))
print("文件 %s 传输成功..." % file_size)
elif msg_data.get("action") == "get": #是GET则执行上传
print("这里写下载的过程..")
conn.close()