好的,所以我的目标是构建一个易于使用的协议(protocol)来通过 tcp 发送数据。基本上,它会通过 tcp 发送一条消息和一个对象(未知类型)。要发送,它只需要一个方法调用,而接收它也只需要一个方法调用。
这就是我想格式化“消息”的方式。
length_of_message - “作为消息的字符串” - length_of_Object - 对象
length_of_message 将是一组字节数。连同 length_of_Object。
实际的消息字符串和实际的对象是可变长度的。
如果不知道对象的实际类,我可以以某种方式将其声明为“通用对象”吗?然后从“通用对象”中获取它的类名,消息会告诉接收者如何处理该对象?
如果它是常量对象类型会很简单,但我希望能够为需要发送/接收的对象使用一个发送函数和一个接收函数。
有什么建议吗?
谢谢, 安德鲁
最佳答案
确保您没有重新发明轮子(除非这样做是您的主要目标)。
考虑到这一点,考虑:
• 实现和使用 NSCoding 协议(protocol)。它允许对复杂连接的对象图(包括循环)进行高效归档。
• 使用 HTTP 而不是原始 TCP。虽然它在 header 中增加了一点开销,但正文可以是直接编码的数据。更重要的是,HTTP 无处不在。它路由几乎任何东西,而其他协议(protocol)可能会被阻止(想想代理服务器)。
• 通过 HTTP,您可以利用压缩。如果通信管道的一侧是某种现有的 Web 服务器,它可能已经支持 gzip 压缩通信。压缩 NSData(这将是 NSCoding 的结果)是微不足道的。
• 或者,坚持使用直立柱。
除非您确实有某些要求使上述内容无法实现,否则您最好利用上述技术而不是推出新技术。
话虽如此,您的建议很好。我可能会添加这样的结构:
[HEADER][MSGID][LEN][TYPE][len 的数据][POST]
其中 POST 是一个已知的字节序列,接收方可以验证它以确保可能正确接收到所有数据。或者你可以全力以赴并整合一个校验和。或者可以根据需要重复子片段(即 [LEN][TYPE][DATA] 一遍又一遍。
关于objective-c - 如何有效地通过 tcp 发送对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10068998/