是否有通过网络套接字连接发送数据的首选方式?

Is there a preferred manner for sending data over a web socket connection?

是否有'correct'或首选方式通过网络套接字连接发送数据?

在我的例子中,我将信息从 C# 应用程序发送到 python (tornado) 网络服务器,我只是发送一个由逗号分隔的多个元素组成的字符串。在 python 中,我使用基本技术拆分字符串,然后将元素结构化为一个对象。 例如:

'foo,0,bar,1'

变为:

object = {
    'foo': 0,
    'bar': 1
}

另一方面,我将信息作为 JSON 字符串发送,然后使用 Json.NET

反序列化

我想这样做并没有严格意义上的正确或错误之分,但是我应该考虑哪些重要的优点和缺点?而且,有点相关的是,是否就使用字符串格式与二进制格式达成共识?

第一个建议是对两种方式使用相同的格式,而不是在一个方向上使用纯文本而在另一个方向上使用 JSON。

我个人认为 {'foo':0,'bar':1}foo,0,bar,1 好,因为每个人都理解 JSON 但对于您的自定义格式,他们可能不会没有一些解释。这个想法是当 JSON 已经是一个并且 @jfriend00 是正确的时候你正在发明一种数据交换格式,现在几乎每种语言都理解 JSON, Python included.

关于文本与二进制,没有任何共识。正如 @ user2864740 在对我的回答的评论中提到的,只要双方相互理解,这并不重要。这只有在一方偏好某种格式时才有意义(例如考虑使用 JavaScript 从浏览器打开连接——因为人们可能更喜欢 JSON 而不是二进制)。

我的建议是使用像 JSON 这样简单的东西并设计您的应用程序,以便您可以通过交换另一个实现来更改线路格式,而不会影响您的应用程序的逻辑。

编写自定义编码(例如,"k,v,..")与'using binary'不同

它仍然是文本,只是一种严格的未定义的一次性手卷格式,必须手动复制。 (如果键或值包含逗号会怎样?如果数据需要包含嵌套对象会怎样?null 的解释与 '' 或 'null' 有何不同?)

虽然 JSON 绝对是 WebSockets 最 普遍存在的 格式,但不应该(出于交换目的)手写 JSON - 一个在两端使用现有的序列化库。 (JSON 无处不在的原因有很多,这在其他答案中有所介绍 - 但是,这并不意味着它总是 'best' 格式。)

为此,也可以使用 binary 序列化器(BSON 是一个简单的例子,因为它在结构和操作上实际上类似于 JSON)。只需将 JSON.parse 替换为 FORMATX.parse 即可。

唯一的要求是:

  • 所有客户端和服务器都有一个合适的serializer/deserializer。 JSON 在这里工作得很好,因为它很受欢迎,而且不乏实现。

    种带有 Python 和 C# 库的各种二进制序列化库,但它需要找到一个 'happy intersection'.

  • 序列化格式可以表示数据。 JSON 通常可以正常工作,并且它与基本对象图 和简单值具有 非常好的 1-1 对应关系。它本质上也是无模式的。

    有些格式更适合某些任务,并且具有不同的特性、特性或工具链。然而,大多数概念(可以说是大多数 DTO)都可以很容易地映射到 JSON,这使它成为一个很好的 'default' 选择。

不同 种类 的二进制和文本序列化之间的其他差异主要是修饰 - 但如果您想开始谈论模式与无模式、可扩展性,外部工具、元数据、非压缩编码大小(或传输压缩后的大小)、符合特定的现有协议等。

..但要点是不要创建'new'一次性格式。当然,除非您只是喜欢制造轮子,或者有一个 非常具体的 用例适合。