背景介绍
在项目中需要实现将边缘端的不断采集到的雷达数据回传到处理器端,
由于雷达数据我们采用分帧存储,每一帧的雷达数据都以bin文件的格式存储,而边缘端算力受限,因此必须将其回传到处理器端;同时数据回传伴随着数据采集一起执行,因此提出了连续回传bin文件的要求。
实现方式
发送端在一个文件发送完毕后发送终止标识,这里我设置的终止标识为 "fn",这里的fn需要根据实际bin文件发送的内容决定,必须是原来bin文件中不会出现的字符,否则会发送不完整。
发送端发送文件和添加终止符代码如下
if os.path.isfile(filename): # 如果文件存在
print("-" * 5 + "开始发送" + "-" * 5)
tcpclient.send(filename.encode("utf-8"))
with open(filename, "rb") as f:
rdata = f.read()
if tcpclient.recv(1024).decode("utf-8") == "ok":
while True:
tcpclient.send(rdata) # 发送rdata
break
# 终止提示
tcpclient.send("fn".encode("utf-8")) # 终止符
print("-" * 5 + "发送完成" + "-" * 5)
接收端在接收文件时需要判断是否以"fn"结尾,注意,由于bin文件以流传输,因此接收端如果不做修剪会把"fn"也存入bin文件中。
接收端接收文件、判断结尾、修剪的代码如下
while True:
rdata = tcpclient.recv(1024) # 接收文件内容
if rdata.endswith(b'fn'): # 到这一步说明收完了
print(rdata[0:len(rdata)-2])
new_file.write(rdata[0:len(rdata)-2]) # 去除"fn"
new_file.close()
break
new_file.write(rdata)
print("-" * 5 + "接收完成" + "-" * 5)
下面是完整代码部分
发送端代码
import socket
import os
import time
def SendFile():
"""发送文件"""
host = "192.168.137.232" # 写入接收端IPv4地址
port = 1026
tcpclient = socket.socket()
try:
tcpclient.connect((host, port))
print('服务器已连接')
except:
print('服务器连接失败,请修改后重新运行!!')
exit(0)
for i in range(3):
filename = "test" + str(i) + ".bin"
if os.path.isfile(filename): # 如果文件存在
print("-" * 5 + "开始发送" + "-" * 5)
tcpclient.send(filename.encode("utf-8"))
with open(filename, "rb") as f:
rdata = f.read()
if tcpclient.recv(1024).decode("utf-8") == "ok":
while True:
tcpclient.send(rdata) # 发送rdata
break
# 终止提示
tcpclient.send("fn".encode("utf-8"))
print("-" * 5 + "发送完成" + "-" * 5)
time.sleep(10)
if __name__ == '__main__':
SendFile()
接收端代码
import socket
import os
def ReceivingFile():
"""
接收文件
"""
host = "192.168.137.232"
port = 1026
tcpserver = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
tcpserver.bind((host, port))
tcpserver.listen(5)
print("等待客户端连接...")
while True:
tcpclient, addr = tcpserver.accept()
print('client addr:', addr)
while True:
print("-" * 5 + "开始接收" + "-" * 5)
file_name_data = tcpclient.recv(1024) # 接收文件名字
print("文件名:" + str(file_name_data))
filename = file_name_data.decode('utf-8')
new_filename = filename
print(f"文件保存为:{new_filename}")
if os.path.exists(new_filename):
os.remove(new_filename)
new_file = open(new_filename, "wb")
tcpclient.send("ok".encode("utf-8"))
while True:
rdata = tcpclient.recv(1024) # 接收文件内容
if rdata.endswith(b'fn'): # 到这一步说明收完了
print(rdata[0:len(rdata)-2])
new_file.write(rdata[0:len(rdata)-2])
new_file.close()
break
new_file.write(rdata)
print("-" * 5 + "接收完成" + "-" * 5)
break
tcpclient.close()
# break # 注释则可以循环接收
tcpserver.close()
if __name__ == '__main__':
ReceivingFile()