【问题标题】:Sending the contents of a hash table over sockets通过套接字发送哈希表的内容
【发布时间】:2012-09-27 00:49:58
【问题描述】:

使用带有套接字的 TCP 服务器/客户端设置,我将如何将诸如哈希表的内容从服务器发送到客户端?

我正在寻找的格式类似于IP address: content

【问题讨论】:

  • 一般希望通过从源中读取数据,将其发送到目标,然后让目标插入来处理这样的事情将其放入最后的哈希表中。 可能让其他方案工作,但充满了问题。
  • 是否可以分解哈希表中的键值对,将它们添加到字符串中,然后对其进行迭代,以便将其发送给客户端?
  • 这取决于它们所代表的数据类型。将它们毫无歧义地放入单个字符串中可能并非易事。
  • 没有好办法只通过套接字发送哈希表。您需要以某种方式对其进行序列化(我推荐使用 JSON),然后发送/接收它。

标签: c sockets tcp hashtable


【解决方案1】:

您是否需要以相同的顺序重建另一端的表?如果是这样,您需要发送数组位置。如果没有,您可以按照您喜欢的任何顺序发送所有字符串,客户端可以插入。

最简单的方法是以文本模式发送,尽管这通常会在客户端增加一些工作量。就个人而言,我会发送表格大小以及预期的字符串数量,并每行发送一个条目:

117 5
puppy
kitten
cub
joey
duckling

如果我也需要数组位置,那么以文本形式发送它们也没有错(但您可能更喜欢二进制):

117 5
8 puppy
42 kitten
57 cub
101 joey
105 duckling

【讨论】:

    【解决方案2】:

    我建议你用msgpack二进制序列化格式打包你的哈希表,通过你的套接字发送它并在另一端解包。

    例如在 Ruby 中(这只是一个示例 - msgpack 在many other languages 上可用!)这将给出:

    require "msgpack"
    > msg = {"192.0.2.1"=>"foo", "192.0.2.2"=>"bar"}.to_msgpack
     => "\x82\xA9192.0.2.1\xA3foo\xA9192.0.2.2\xA3bar"
    > msg.bytesize
     => 29
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-04-15
      • 1970-01-01
      • 2015-07-17
      • 1970-01-01
      • 1970-01-01
      • 2014-07-15
      • 2014-08-10
      相关资源
      最近更新 更多