如何在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
相关产品推荐
相关产品推荐

