Python 套接字 - 创建消息格式

Posted

技术标签:

【中文标题】Python 套接字 - 创建消息格式【英文标题】:Python Sockets - Creating a message format 【发布时间】:2010-01-11 13:37:34 【问题描述】:

我已经构建了一个 Python 服务器,各种客户端可以连接到该服务器,并且我需要设置从客户端到服务器的一系列预定义消息 - 例如,客户端在第一次连接时将名称传递给服务器。

我想知道解决这个问题的最佳方法是什么?我应该如何为他们的通信建立一个简单的协议?

消息是否应该以一组特定的字节开始以将它们标记为该协议的一部分,然后包含某种消息 ID?任何建议或进一步阅读表示赞赏。

【问题讨论】:

【参考方案1】:

首先,您需要决定是希望您的协议是人类可读的(更多开销)还是二进制的。如果是第一个,您可能希望使用正则表达式来解码消息。为此,请使用 python 模块re。如果是后者,模块struct 就是你的朋友。

其次,如果您正在构建一个以某种方式有状态的协议(例如,首先我们进行握手,然后我们传输数据,然后我们检查校验和并说再见)您可能想要创建某种FSM 来跟踪国家。

第三,如果协议设计不是一个熟悉的主题,阅读一些简单的协议规范,例如IETF

如果这不是一个学习练习,你可能想从其他东西开始,比如 Python Twisted

【讨论】:

-1 使用正则表达式解码消息不是一个好主意。如果你想要人类可读,那么坚持使用 xml 之类的东西,它仍然相当容易快速和健壮地解析。 二进制很好,但我想知道如何创建消息本身。我正在努力寻找有关如何最好地构建消息的任何信息。我了解如何编写规范,但它是构建我正在努力解决的实际信息的复杂性。例如,我应该使用什么样的数据来标记消息的开头。我应该如何关闭每条消息? 这是一个序列化问题。尝试 XML、JSON 或(如果您信任您的客户端并且它们是相同的架构)pickle。 我认为二进制协议的“标准”方法是为“N=有效载荷数量”+(N*“有效载荷类型”+“有效载荷长度”+“有效载荷”提供固定大小的字段)【参考方案2】:

根据要求,您可能需要考虑使用 JSON:使用带有 JSON 编码的“换行符”终止的字符串。传输协议可以是 HTTP:这样,您就可以访问所有“与连接相关的”设施(例如状态代码)并拥有 JSON 编码的有效负载。

使用 JSON 优于 HTTP 的优势:

    人类可读(调试等) 可用于所有语言/平台的库 跨平台 浏览器可调试(在某种程度上)

当然,还有很多其他方法可以给这只猫剥皮,但是使用这种方法制作原型的时间非常短。如果可以满足您的要求(这里不是很详细),这是值得考虑的。

【讨论】:

这个有一个规范,带有 JSON-RPC:json-rpc.orgcode.google.com/p/python-jpc【参考方案3】:

阅读一些协议,并尝试找到一个看起来像您需要的协议。它需要面向消息还是面向流?它是否需要保留请求顺序,是否需要将请求与响应配对?您需要消息标识符吗?重试,后退?是RPC协议还是消息队列协议?

【讨论】:

【参考方案4】:

请参阅http://www.faqs.org/docs/artu/ch05s02.html 和http://www.faqs.org/docs/artu/ch05s03.html,了解有关数据文件格式和协议的良好概述和讨论。

【讨论】:

这些网址已失效。

以上是关于Python 套接字 - 创建消息格式的主要内容,如果未能解决你的问题,请参考以下文章

套接字阻止在 Java 服务器和 Python 客户端之间发送消息

使用 Python 和 websocket 创建实时聊天

如何在 Python 中使用套接字创建通道

Python网络编程_TCP(简略版)

同时发送/接收消息套接字python

Python3 & 基于TCP的方式实现客户端与服务器端互发消息