【问题标题】:Is there a preferred manner for sending data over a web socket connection?是否有通过 Web 套接字连接发送数据的首选方式?
【发布时间】:2015-05-14 00:39:24
【问题描述】:

是否存在通过 Web 套接字连接发送数据的“正确”或首选方式?

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

'foo,0,bar,1'

变成:

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

在另一个方向,我将信息作为 JSON 字符串发送,然后我使用 Json.NET 对其进行反序列化

我想这样做没有绝对正确或错误的方法,但是我应该考虑到显着的优点和缺点吗?而且,有点相关的是,使用字符串和二进制格式是否存在共识?

【问题讨论】:

  • JSON 通常是首选的传输格式,因为现在几乎每种语言都具有与母语格式和 JSON 相互转换的功能。
  • 两个答案都值得赞赏。尽管我仍然好奇(并且可能还会尝试)二进制序列化器,但我或多或少地朝着 JSON 序列化器方向前进。

标签: c# python json websocket binary


【解决方案1】:

编写自定义编码(例如,“k,v,..”)与“使用二进制”不同

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

虽然 JSON 绝对是 WebSockets 最普遍存在的格式,但不应该(出于交换目的)手动编写 JSON - 在两端都使用现有的序列化库 . (JSON 无处不在的原因有很多,其他答案中对此进行了介绍——但这并不意味着它始终是“最佳”格式。)

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

唯一的要求是:

  • 所有客户端和服务器都有一个合适的序列化器/反序列化器。 JSON 在这里工作得很好,因为它非常流行并且不乏实现。

    各种二进制序列化库,Python 和 C# 库,但它需要找到一个“快乐的交点”。

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

    某些格式更好的是某些任务,并且具有不同的特征、功能或工具链。然而,大多数概念(可以说是大多数 DTO)都可以轻松映射到 JSON,这使其成为一个很好的“默认”选择。

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

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

    • 人们会使用FORMATX.parse(..)。这与“二进制”与“文本”无关,只是“某种手工创建的格式”与“某种带有 JavaScript(和 C#)实现的格式”。二进制传输规范涵盖了编码规则(包括字节序),就像 JSON 规范定义 JSON 一样。
    • 虽然大多数答案都有很好的建议,但正如解释的那样,(第 3 段)非常具有误导性。只要双方都理解这种格式(并且有几种流行的二进制格式支持 JavaScript),那么它就不会真正适用。 手工编写与“使用二进制”不同。 (在 OP 的情况下,它仍然是“文本”,只是采用 手工/自定义 格式。)
    • 我只是说二进制比文本有一些缺点,因为我们在这里使用的是 websockets 连接,大多数时候在浏览器中都有一个端点。并且 OP 确实问过......我会改写,看看你是否更喜欢它。
    • 但它是 误导 因为除非手动生成 JSON 不正确(例如,未使用适当的序列化程序),否则只需将 JSON.parse 替换为FORMATX.parse。虽然使用的格式存在一些差异(例如,有些需要单独的模式,但并非所有将 1-1 映射到即席 JavaScript 图),但请考虑将 BSON.parse 作为说明前一点的示例。
    猜你喜欢
    • 2018-12-20
    • 2010-12-10
    • 1970-01-01
    • 2019-06-12
    • 1970-01-01
    • 1970-01-01
    • 2012-02-12
    • 2016-04-06
    • 1970-01-01
    相关资源
    最近更新 更多