使用Python的socket实现循环bin文件传输

背景介绍

在项目中需要实现将边缘端的不断采集到的雷达数据回传到处理器端,

由于雷达数据我们采用分帧存储,每一帧的雷达数据都以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()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值