Публикация сетевых служб

Добрый день включает динамическое открытие сетевых служб в сетях IP без централизованного сервера каталогов. Платформа Основы NSNetService класс представляет экземпляры Добрый день сетевых служб. В этой главе описываются процесс для публикации Добрый день сетевых служб с NSNetService.

Процесс публикации

Добрый день сетевые службы используют стандартную информацию DNS для распространения их существования потенциальным клиентам в сети. В Какао, NSNetService класс обрабатывает подробные данные публикации службы.

Как правило, Вы используете NSNetService опубликовать услугу, предоставленную сокетом, принадлежавшим тому же процессу. Однако, потому что NSNetService класс не использует сокет всегда, можно также использовать класс для распространения от имени службы другого процесса, такой как процесс Ftp-сервера, еще не обновленный для поддержки Добрый день. Однако при создании сетевой службы IP необходимо включать Добрый день код публикации как часть его процесса запуска.

Поскольку сетевая активность может иногда занимать время, NSNetService объекты обрабатывают запросы публикации асинхронно, поставляя информацию через методы делегата. Использовать NSNetService правильно, Ваше приложение должно присвоить делегата в каждом NSNetService экземпляр это создает. Поскольку идентификационные данные NSNetService объект передается в качестве параметра в методах делегата, можно использовать одного делегата к кратному числу NSNetService объекты.

Публикация Добрый день сетевой службы предпринимает четыре шага:

  1. Установите допустимый TCP, слушая сокет (или сокет данных UDP) для коммуникации.

  2. Инициализируйте NSNetService экземпляр с именем, введите, домен и номер порта, и присвойте делегата в объекте.

  3. Опубликуйте NSNetService экземпляр.

  4. Реагируйте на сообщения, отправленные в NSNetService делегат объекта.

Следующие разделы описывают эти шаги подробно.

Конфигурирование сокета для службы

Добрый день сетевые службы требуют или TCP, слушая сокет или сокета данных UDP.

Если у Вас уже есть существующий сетевой код, можно продолжать использовать его как есть и обеспечить его номер порта для Добрый день при инициализации службы.

Если у Вас нет существующего сетевого кода, используйте API CFSocket:

Для изучения, почему CFSocket рекомендуется читайте Используя Сокеты и Потоки Сокета в Сетевом Обзоре.

Для более подробного обзора того, как записать TCP - или основанный на UDP демон, читайте Используя Сокеты и Потоки Сокета в Сетях Тем Программирования.

Инициализация и публикация сетевой службы

Инициализировать NSNetService экземпляр для публикации, используйте initWithDomain:type:name:port: метод. Этот метод устанавливает экземпляр с надлежащей информацией о сокете и добавляет его к текущему циклу выполнения.

Экспрессы типа службы оба протокол прикладного уровня (FTP, HTTP, и т.д.) и транспортный протокол (TCP или UDP). Формат как описан в Доменных Соглашениях о присвоении имен, например, _printer._tcp для принтера по TCP.

Имя службы может быть произвольным NSString, но значение больше не должно быть, чем 63 байта в кодировании UTF-8. Поскольку это - имя, которое должно быть представлено пользователям, это должно быть человекочитаемым и дескриптивным из определенного экземпляра службы. Рассмотрите разрешение пользователю переопределить любое имя по умолчанию, которое Вы обеспечиваете.

Один рекомендуемый подход должен использовать имя компьютера в качестве имени службы. Если Вы передаете пустую строку (@"") для параметра имени службы система автоматически распространяет Вашу службу с помощью имени компьютера в качестве имени службы. Для примеров других подходов именования считайте Добрый день Обзор.

Если необходимо создать имя службы нестандартным способом, можно получить имя компьютера сами. В OS X на рабочем столе можно получить имя компьютера путем вызова SCDynamicStoreCopyComputerName функция от платформы Конфигурации системы. В iOS можно получить ту же информацию из name свойство UIDevice класс.

При публикации службы необходимо также указать домен, в котором должна быть опубликована служба. Вот некоторые общие ценности:

На инициализацию, NSNetService объект автоматически планируется на текущий цикл выполнения с режимом по умолчанию. Если Вы хотите запланировать его на различный цикл выполнения или с различным режимом, можно вызвать removeFromRunLoop:forMode: и scheduleInRunLoop:forMode: методы.

После того, как инициализация завершена и допустима, присвойте делегата в NSNetService объект с setDelegate: метод. Наконец, опубликуйте службу с publish метод, сразу возвращающийся. Добрый день выполняет публикацию асинхронно и возвращает результаты через методы делегата.

Перечисление 2-1 демонстрирует инициализацию и процесс публикации для Добрый день сетевых служб. Объяснение кода следует за ним. Для хорошего примера публикации службы см. проект примера кода PictureSharing в Библиотеке Разработчика Mac.

  Инициализация перечисления 2-1 и публикация Добрый день сетевой службы

void myRegistrationFunction(uint16_t port) {
id delegateObject;      // Assume this exists.
NSNetService *service;
 
    service = [[NSNetService alloc] initWithDomain:@""// 1
                                    type:@"_music._tcp"
                                    name:@""
                                    port:port];
    if(service)
    {
        [service setDelegate:delegateObject];// 2
        [service publish];// 3
    }
    else
    {
        NSLog(@"An error occurred initializing the NSNetService object.");
    }
}

Вот то, что делает код:

  1. Инициализирует NSNetService объект. Этот пример использует домен (ы) по умолчанию для публикации и гипотетической музыкальной службы TCP/IP.

  2. Устанавливает делегата к NSNetService объект. Этот объект обрабатывает все результаты NSNetService объект, как описано в Реализации Методов делегата для Публикации.

  3. Публикует службу к сети.

Для остановки службы, которая уже работает или находится в процессе запуска используйте stop метод.

Реализация методов делегата для публикации

NSNetService предоставляет Вашему приложению информацию о статусе публикации вызывающими методами для ее делегата. При публикации службы объект делегата должен реализовать следующие методы:

netServiceWillPublish: метод уведомляет делегата, который Добрый день готов опубликовать службу. Когда этот метод вызывают, служба еще не видима к сети, что означает, что публикация может все еще перестать работать. Однако можно предположить, что служба видима если NSNetService вызывает Вашего делегата netService:didNotPublish: метод.

netServiceDidPublish: метод уведомляет делегата, Добрый день успешно опубликовавшего службу.

netService:didNotPublish: когда публикация перестала работать по любой причине, метод вызывают. Ваш делегат netService:didNotPublish: метод должен извлечь тип ошибки из возвращенного словаря с помощью NSNetServicesErrorCode ключ и обрабатывает ошибку соответственно. Для полного списка возможных ошибок посмотрите Ссылку класса NSNetService.

netServiceDidStop: метод вызывают в результате stop сообщение, отправляемое в NSNetService объект. Если этот метод вызывают, служба больше не публикуется.