【问题标题】:How to send objects over tcp efficiently如何有效地通过 tcp 发送对象
【发布时间】:2012-04-09 13:11:58
【问题描述】:

好的,所以我的目标是构建一个易于使用的协议,用于通过 tcp 发送数据。基本上,它会通过 tcp 发送一条消息和一个对象(类型未知)。发送只需要一个方法调用,接收也只需要一个。

这就是我想如何格式化“消息”的方式。

length_of_message - “作为消息的字符串” - length_of_Object - 对象

length_of_message 将是一组字节数。以及length_of_Object。

实际的消息字符串和实际的对象是可变长度的。

如果不知道对象的实际类,我可以以某种方式将其声明为“通用对象”吗?然后从“通用对象”中获取其类名,消息会告诉接收者如何处理该对象?

如果它是一个常量对象类型会很简单,但我希望能够为需要发送/接收的任何对象使用一个发送函数和一个接收函数。

有什么建议吗?

谢谢, 安德鲁

【问题讨论】:

  • NSString 的-lengthOfBytesUsingEncoding: 听起来可以解决动态方面的问题。

标签: objective-c ios object tcp nsdata


【解决方案1】:

确保您没有重新发明轮子(除非这样做是您的主要目标)。

考虑到这一点,考虑:

• 实施和使用 NSCoding 协议。它允许对复杂连接的对象图(包括循环)进行有效归档。

• 使用 HTTP 代替原始 TCP。虽然它在标头中增加了一些开销,但正文可以是直接编码的数据。更重要的是,HTTP 无处不在。它几乎可以路由任何东西,而其他协议可能会被阻止(想想代理服务器)。

• 通过 HTTP,您可以利用压缩。如果您的通信管道的一侧是某种现有的 Web 服务器,它可能已经支持 gzip 通信。压缩 NSData(这将是 NSCoding 的结果)很简单。

• 或者,坚持使用直管。

除非您确实有某些要求使上述技术无法实现,否则您最好利用上述技术而不是推出新的技术。

话虽如此,你的提议很好。我可能会添加如下结构:

[HEADER][MSGID][LEN][TYPE][DATA of len][POST]

POST 是一个已知的字节序列,接收者可以验证它以确保所有数据都被正确接收。或者您可以全力以赴并集成校验和。或者可以根据需要重复子片段(即 [LEN][TYPE][DATA] 一遍又一遍。

【讨论】:

  • 直到现在我才真正理解 NSCoding 的用途,它看起来绝对完美!另外,我想我可能只是为了协议与 TCP 的健壮性而切换到 HTTP。不过还是非常感谢!我只会使用 NSCoding,因为它是一个非常简单的解决方案。
  • NSCoding 常用于桌面上的文档编码(文档格式不需要是可移植的)......
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多