如何定义通信协议?

时间:2011-05-10 13:33:57

标签: cocoa-touch cocoa networking network-protocols

我是网络概念的新手,需要解释如何实现用于发送不同类型消息的通信协议。我目前正在开发一个可以在iPhone之间发送视频消息的Cocoa应用程序。目前我只发送类型为3的消息。这是我需要实现的应用程序流程:

  1. 浏览网络上的可用iPhone(使用Bonjour)

  2. 找到iPhone客户端后,发送NSData“请求联系信息”( MessageType1

    iPhone客户端将发回一个带有联系信息的NSData实例( MessageType2

  3. 发布带有录制视频的新消息,发送给选定的联系人( MessageType3

  4. 当收到不同类型的消息时,需要以不同方式处理它们。我想解决这个问题的一种方法是在消息中添加标识消息类型的标题并在接收方提取,然后像这样处理:

    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];
    

    这是一个很好的方式吗?如果是这样,协议规则是否应以更正式的方式定义,例如在一个单独的类或什么?我在这里寻找最好的整体解决方案,所以如果有更好的方法,请不要过多关注我的图纸......

1 个答案:

答案 0 :(得分:0)

  

这是一种很好的做法吗?

这是定义通信协议的标准方法。来自Wikipedia article

  

交换数字消息位串。位串被分成字段,每个字段携带与协议相关的信息。从概念上讲,比特串被分成两个部分,称为标题区和数据区。实际消息存储在数据区域中,因此标题区域包含与协议更相关的字段。传输的大小有限,因为传输错误的数量与发送的位串的大小成比例。比最大传输单元(MTU)长的比特串被分成适当大小的部分。每个部分具有几乎相同的标题区域内容,因为只有一些字段依赖于数据区域的内容(特别是CRC字段,包含根据数据区域内容计算的校验和)。

结束维基百科报价

  

如果是这样,协议规则是否应以更正式的方式定义,例如在一个单独的类或什么?

这取决于你。没有必要,因为您的应用程序正在与您的应用程序的其他副本进行通信。