Как определить протокол связи?

#cocoa-touch #cocoa #networking #network-protocols

#cocoa-touch #cocoa #сеть #сеть-протоколы

Вопрос:

Я новичок в сетевых концепциях, и мне нужно объяснение того, как реализовать протокол связи для отправки различных типов сообщений. В настоящее время я работаю над приложением 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];
  

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

Ответ №1:

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

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

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

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

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

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

Комментарии:

1. Приятно, похоже, я попал в точку без каких-либо предварительных знаний об этих вещах. Я думаю, что простые концепции, вероятно, должны быть реализованы соответствующим образом. Спасибо за подтверждение моей процедуры!