Как определить протокол связи? - PullRequest
0 голосов
/ 10 мая 2011

Я новичок в сетевых концепциях и мне нужно объяснение того, как реализовать протокол связи для отправки различных типов сообщений. В настоящее время я работаю над приложением Какао, которое будет отправлять видео-сообщения между iPhone. В настоящее время я отправляю только сообщения типа 3. Вот поток приложений, который мне нужно реализовать:

  1. Просмотр доступных айфонов в сети (с использованием 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];

Это хороший способ сделать это? Если это так, должны ли правила протокола быть определены более формально, например, в отдельный класс что ли? Я ищу лучшее общее решение, поэтому не обращайте особого внимания на мои рисунки, если есть лучший способ сделать это ...

1 Ответ

0 голосов
/ 10 мая 2011

Это хороший способ сделать это?

Это стандартный способ определения протокола связи. Из статьи Википедии :

Обмен битовыми цепями цифровых сообщений. Битовые строки разделены на поля, и каждое поле несет информацию, относящуюся к протоколу. Концептуально цепочка битов разделена на две части, называемые областью заголовка и областью данных. Фактическое сообщение хранится в области данных, поэтому область заголовка содержит поля, имеющие большее отношение к протоколу. Размер передачи ограничен, поскольку количество ошибок передачи пропорционально размеру передаваемых цепочек битов. Битовые строки, длина которых превышает максимальную единицу передачи (MTU), делятся на части соответствующего размера. Каждый фрагмент имеет почти одинаковое содержимое области заголовка, поскольку только некоторые поля зависят от содержимого области данных (особенно поля CRC, содержащие контрольные суммы, которые вычисляются из содержимого области данных).

Конец цитаты из Википедии

Если это так, следует ли определять правила протокола более формальным образом, например, в отдельный класс или что-то?

Это зависит от вас. В этом нет необходимости, поскольку ваше приложение взаимодействует с другими копиями вашего приложения.

...