【问题标题】:How to define a communication protocol?如何定义通信协议?
【发布时间】:2011-05-10 22:26:20
【问题描述】:

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

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

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

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

  3. 使用录制的视频发起一条新消息,发送给选定的联系人(MessageType3

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

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

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

【问题讨论】:

    标签: cocoa-touch cocoa networking network-protocols


    【解决方案1】:

    这是一个不错的方法吗?

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

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

    结束维基百科引述

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

    这取决于你。这不是必需的,因为您的应用程序正在与您的应用程序的其他副本通信。

    【讨论】:

    • 很好,看起来我在没有任何先验知识的情况下就发现了这些东西。我想简单的概念可能应该相应地实施。感谢您确认我的程序!
    猜你喜欢
    • 1970-01-01
    • 2017-05-16
    • 2021-04-18
    • 1970-01-01
    • 1970-01-01
    • 2012-10-24
    • 1970-01-01
    • 1970-01-01
    • 2013-09-01
    相关资源
    最近更新 更多