如何有效地通过tcp发送对象

时间:2012-04-09 04:47:48

标签: objective-c ios object tcp nsdata

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

所以这就是我想要格式化“消息”的方式。

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

length_of_message将是一组设定的字节。以及length_of_Object。

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

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

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

有什么建议吗?

谢谢, 安德鲁

1 个答案:

答案 0 :(得分:2)

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

考虑到这一点,请考虑:

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

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

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

•或者,坚持使用直钳。

除非你真的有一些要求使上述技术变得不可行,否则你最好不要利用上述技术而不是推出新技术。

话虽如此,你的建议很好。我可能会添加一个类似的结构:

[HEADER] [MSGID] [LEN] [TYPE] [len的数据] [POST]

如果POST是已知的字节序列,接收方可以验证以确保可能正确接收到所有数据。或者你可以全力以赴并整合校验和。或者可以根据需要重复子片段(即[LEN] [TYPE] [DATA]一遍又一遍。