python通过tcp协议发送二进制数据

本文介绍了如何使用C++编写发送和接收私有化协议数据包的程序,并用Python进行测试。虽然过程简单,但指出在实际工程中,随着结构复杂性和维护需求,这种方法可能效率低下且不易维护。
摘要由CSDN通过智能技术生成

写c++程序时经常会有发送私有化协议的过程,比如头结构+数据包,数据包往往是一个结构体,有时为了方便调试会用python写一些测试程序。

发送的包的结构图示例如下:

接收包的结构图如下:

当然接收的RespBody会很多, iCount为1时即为图上所示,如果为2,则还要再画一个RespBody

想法很简单,将要发送的数据结构用python写出类:


# 构造要发送的二进制数据
class ReqHead:   # 12 byte
    def __init__(self):
        self.iCheck = 64        # u16
        self.iLen = 0          # u32

    def pack(self):
        return struct.pack('<HI',self.iCheck, self.iLen)


class ReqBody:
    def __init__(self):
        self.m_lTime = int(datetime.now().timestamp()) - (int(datetime.now().timestamp()) % 86400) - 86400  # 获取当天前1天时间戳

    def pack(self):
        return struct.pack('<I', self.m_lTime)


class RespHead:    # 8
    def __init__(self):
        self.m_lTime = 0    # long
        self.m_uCount = 0   # u32 ///< 回包结构体条目数量

    def unpack(self, data):
        self.m_lTime, self.m_uCount = struct.unpack('<iI', data)


class RespBody:    # 26
    def __init__(self):
        self.m_uiMarket = 0  # 市场   u16
        self.m_szCode = ""  # 代码    s8

    def unpack(self, data):
        self.m_uiMarket, code = struct.unpack('<H8s', data)
        self.m_szCode = code.decode('utf-8')

对于请求的,将数据打包成二进制数,对于返回的将二进制数拆解成类结构,在这里pack即打包,unpack为拆解。

然后按照先发送请求,再按结构读取的过程即可。


req_head = ReqHead()
req_body = ReqBody()
req_head.iLen = 4    # req_body的长度

# 建立 TCP 连接并发送数据
with (socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s):
    s.connect((TCP_IP, TCP_PORT))
    s.sendall(req_head.pack() + req_body.pack())    # 发送数据
    data = s.recv(8)  # 返回头是8字节
    resp_head = RespHead()
    resp_head.unpack(data)
    for i in range(resp_head.m_uCount):
        data = s.recv(10)
        resp_body = RespBody()
        resp_body.unpack(data)
        print(resp_body.m_uiMarket, resp_body.m_szCode)

当然,最后要加上对应的头文件:

import socket
import struct
from datetime import datetime

小结:

这个过程看起来挺简单,并且也实现了二进制结构的测试功能。代码也很清晰易懂。

不过这是一个玩具程序,实际的工程会异常复杂,如果按这种逻辑来写的话会很累,且后期维护也会非常不易,比如巨大的结构中增加或删除某些变量,某些类型有所改变,改动的过程会很辛苦,因为拆解包时需要一个个核对,稍有不慎就会错误一大堆。

  • 4
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
### 回答1: 在 Python 中,可以使用 `struct` 模块将数据打包成二进制格式,然后使用 `socket` 模块将其发送。以下是一个示例代码: ``` import socket import struct # 打包数据 data = struct.pack('iif', 1, 2, 3.14) # 创建 socket 对象 s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 连接服务器 s.connect(('localhost', 8888)) # 发送数据 s.sendall(data) # 关闭 socket 连接 s.close() ``` 在上面的代码中,我们使用 `struct.pack()` 方法将整数 `1`、`2` 和浮点数 `3.14` 打包成二进制格式。我们使用 `socket` 模块创建一个 TCP 连接,并将数据发送给服务器。最后,我们关闭 socket 连接。需要注意的是,发送数据必须是 bytes 类型。 ### 回答2: Socket发送二进制数据是一种常见的网络通信方法。在Socket编程中,二进制数据可以被发送和接收,这意味着可以传输任意格式的数据,例如图片、视频、音频等。 在发送二进制数据之前,首先需要将数据转换为二进制格式。在编程语言中,通常有提供相应的函数或方法来完成这个转换过程。例如,在Python中,可以使用`struct`模块来将数据打包为二进制格式。 一旦数据被转换为二进制格式,可以使用Socket的`send`方法或其他相应的发送函数将数据发送出去。发送时,需要指定目标主机的IP地址和端口号,以确保数据被正确发送到指定的目的地。 接收方在收到二进制数据后,需要对收到的数据进行解析。同样地,可以使用相应的函数或方法将二进制数据解析为原始数据格式。例如,在Python中,可以使用`struct`模块的`unpack`函数来解析二进制数据。 值得注意的是,在进行二进制数据传输时,需要保证发送方和接收方对数据的解析方式是一致的。否则,数据可能无法正确地解析,导致通信无法正常进行。 总之,通过socket发送二进制数据是一种常见和有效的方式,可以用于实现各种复杂的网络通信需求。 ### 回答3: socket是一种通信协议,可以用来在网络上进行数据传输。它可以发送不同类型的数据,包括文本和二进制数据发送二进制数据时,首先需要将数据转换为二进制格式。在编程中,可以使用编码库来进行转换,例如Python中的struct模块或者Java中的ByteBuffer类。 要发送二进制数据,首先需要建立一个socket连接。连接可以是客户端和服务器之间的连接,或者是两台计算机之间的连接。连接建立后,可以通过socket对象的方法来发送数据。 在发送数据之前,需要确保已经将数据转换为二进制格式。可以使用编码库来将数据打包为二进制格式,例如使用struct.pack()函数来打包数据。 然后,可以使用socket对象的send()方法来发送数据。该方法接受一个二进制数据作为参数,并将其发送到目标服务器。 在接收端,需要相应地解析二进制数据。可以使用相应的解码方法,如struct.unpack()函数来解析二进制数据。 总结起来,通过socket发送二进制数据需先将数据转换为二进制格式,并利用socket的send()方法发送,接收端则需使用解码方法来解析二进制数据

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

永远的麦田

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值