我是网络概念的新手,需要解释如何实现用于发送不同类型消息的通信协议。我目前正在开发一个可可应用程序,该应用程序将在iPhone之间发送视频消息。目前我只发送类型 3 的消息。下面是我需要实现的应用流:
-
浏览网络上可用的iPhone(使用Bonjour)
-
找到 iPhone 客户端后,发送 NSData "请求联系信息"(消息类型1)
iPhone 客户端将发回一个包含联系信息的 NSData 实例 (MessageType2)
-
使用录制的视频初始化新消息,发送给选定的联系人(消息类型3)
当收到不同类型的消息时,需要以不同的方式处理它们。我想解决它的一种方法是在消息中添加一个标头来标识消息类型并将其提取到接收方,然后像这样处理:
if (messageType == 1) // MessageType1
[self sendMyContactInfo:(Contact *)ownInfo];
if (messageType == 2) // MessageType2
[self updateViewWithContactInfo:(Contact *)contactInfo];
if (messageType == 3) // MessageType3
[self sendMessageToSelectedContact:(Message *)message]
为了为 MessageType3 创建消息,我将执行以下操作:
/* Not currently implemented */
NSMutableData *data = [[NSMutableData alloc] init];
int messageType = 3;
[data appendBytes:messageType]
/* Already Implemented */
NSData *encodedMessage = [NSKeyedArchiver archivedDataWithRootObject:message];
[data appendData:encodedMessage];
[self sendMessage:(NSData *)encodedMessage];
这是一种好方法吗?如果是这样,协议规则是否应该以更正式的方式定义,例如在单独的类或其他什么地方?我在这里寻找最好的整体解决方案,所以如果有更好的方法,不要太注意我的图纸......
这是一种好方法吗?
这是定义通信协议的标准方法。 来自维基百科文章:
交换数字消息位串。位串划分为字段,每个字段都携带与协议相关的信息。从概念上讲,位字符串分为两部分,称为标头区域和数据区域。实际消息存储在数据区域中,因此标头区域包含与协议更相关的字段。传输的大小是有限的,因为传输错误的数量与要发送的位串的大小成正比。长度超过最大传输单元 (MTU) 的位串被划分为适当大小的段。每个部分具有几乎相同的标头区域内容,因为只有某些字段依赖于数据区域的内容(特别是CRC字段,其中包含从数据区域内容计算的校验和)。
结束维基百科引用
如果是这样,协议规则是否应该以更正式的方式定义,例如在单独的类或其他什么地方?
这取决于你。 这不是必需的,因为您的应用程序正在与应用程序的其他副本进行通信。