2012-04-09 39 views
0

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

所以这就是我想如何格式化“消息”。

length_of_message - “即一个消息的字符串” - length_of_Object - 对象

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

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

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

这将是简单的,如果它是一个常量的对象类型,但我希望能够使用一个发送函数和一个接收函数永远对象需要发送/接收。

有什么建议吗?

感谢, 安德鲁

+0

NSString的'-lengthOfBytesUsingEncoding:'听起来像会解决它的动态方面。 – CodaFi 2012-04-09 04:50:17

回答

2

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

考虑到这一点,可以考虑:

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

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

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

•或者,坚持笔直。

除非您确实有一些要求使上述内容不可行,否则您最好利用上述技术而不是滚动新的技术。

这样说,你提出的是好的。我想补充,可能的话,一个结构,如:

[HEADER] [MSGID] [LEN] [类型] [LEN的DATA] [POST]

当POST是字节的已知序列,接收器可以验证以确保可能所有数据都已正确接收。或者你可以全力以赴并整合校验和。或者可以根据需要重复子部分(即[LEN] [TYPE] [DATA]反复。

+0

我从来没有真正理解到目前为止,NSCoding被用于什么,它看起来绝对完美!另外,我想我可能会切换到HTTP,只是为了协议vs TCP的稳健性。尽管非常感谢!我只是要使用NSCoding,因为它有这样一个简单的解决方案。 – Boos1993 2012-04-09 05:25:33

+0

NSCoding常用于在桌面上编码文档(文档格式不需要可移植).... – bbum 2012-04-09 16:50:20