You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Python3的Twisted包中无需编解码直接发送数字类型消息

基于Twisted实现多客户端直接发送数字消息方案

前置依赖

  • 首先安装Twisted包:pip install twisted

核心实现逻辑

我们使用struct模块直接将数字打包为二进制字节流(全程不涉及字符串编码/解码操作),Twisted的transport直接发送打包后的字节即可,接收端用struct解包得到原始数字,支持3个及以上客户端同时接入。

服务端代码(负责接收多客户端发送的数字)

from twisted.internet import reactor, protocol
import struct

class NumberServerProtocol(protocol.Protocol):
    def connectionMade(self):
        client_ip = self.transport.getPeer().host
        print(f"客户端 {client_ip} 已接入")

    def dataReceived(self, data):
        # 直接解包二进制数据为数字,无需字符串解码
        # 格式符!I对应4字节无符号整数,可按需调整,比如!q对应8字节有符号整数
        received_num = struct.unpack('!I', data)[0]
        client_ip = self.transport.getPeer().host
        print(f"收到来自客户端 {client_ip} 的数字:{received_num}")

class NumberServerFactory(protocol.Factory):
    protocol = NumberServerProtocol

if __name__ == '__main__':
    reactor.listenTCP(8000, NumberServerFactory())
    print("服务端已启动,监听8000端口,等待客户端接入...")
    reactor.run()

客户端代码(3个客户端可复用该代码)

from twisted.internet import reactor, protocol
import struct

class NumberClientProtocol(protocol.Protocol):
    def connectionMade(self):
        # 直接打包数字为二进制字节,无需转字符串编码
        # 示例发送数字12345,可替换为实际需要发送的数字
        num_to_send = 12345
        binary_data = struct.pack('!I', num_to_send)
        self.transport.write(binary_data)
        print(f"已发送数字:{num_to_send}")
        # 不需要保持连接可直接关闭,需要长连接可删除下行代码
        self.transport.loseConnection()

class NumberClientFactory(protocol.ClientFactory):
    protocol = NumberClientProtocol

    def clientConnectionFailed(self, connector, reason):
        print(f"连接失败:{reason.getErrorMessage()}")
        reactor.stop()

    def clientConnectionLost(self, connector, reason):
        print("连接已断开")
        reactor.stop()

if __name__ == '__main__':
    # 替换为实际服务端IP
    reactor.connectTCP("127.0.0.1", 8000, NumberClientFactory())
    reactor.run()

关键说明

  • 全程没有调用encode()/decode()等字符串编解码方法,数字直接通过struct.pack/struct.unpack转为二进制字节流,完全符合需求
  • struct格式符可根据要发送的数字范围调整:
    • !I 对应4字节无符号整数,可存储0~4294967295范围的数字
    • !q 对应8字节有符号整数,可存储-9223372036854775808~9223372036854775807范围的数字
  • 同时启动3份客户端代码即可实现3客户端同时发送数字的需求,服务端会自动处理所有客户端的连接和数据接收

内容的提问来源于stack exchange,提问作者Sina Rouzbahani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.18 14:24:06