Обнаружение и распространение сетевых служб

OS X и iOS обеспечивают четыре APIs для обнаружения и распространения сетевых служб:

В дополнение к этому APIs iOS предлагает Мультиравноправную Платформу Связи, предоставляющую поддержку для обнаружения и связи с экземплярами Вашего приложения и связанных приложений на соседних устройствах с помощью Wi-Fi инфраструктуры, однорангового Wi-Fi и Bluetooth.

Как правило необходимо использовать Гэйма Кита только для связанных с игрой одноранговых сетей. Для других одноранговых сетей между устройствами на iOS рабочий iOS 7 и позже, необходимо рассмотреть использование Мультиравноправной платформы Связи.

Для совместимости с более старыми версиями iOS можно также записать собственный сетевой код и использование CFNetService или NSNetService распространять его доступность.

Добрый день обзор службы

Реклама службы Bonjour состоит из трех частей:

Когда приложение просматривает для служб Bonjour, оно просит службы, соответствующие определенный тип в определенном домене, и оно возвращает список соответствия имен службы. Это должно тогда представить надлежащий UI пользователю. Когда пользователь говорит приложению соединяться с определенной службой, приложение должно тогда соединиться со службой с помощью подключения к службе API. (Если это не возможно по некоторым причинам, приложение может передать имя хоста службы и порт к подключению по имени API или, если подключение по имени, API не доступен, приложение, может попросить Добрый день разрешать имя хоста, и приложение может тогда соединиться IP-адресом и номером порта.)

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

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

  • Для Objective C и Базового кода Основы, рекомендуемый путь с CFNetServices API.

  • Для переносимого кода C, который должен работать на операционных системах кроме iOS и OS X, Открытие C Службы DNS, которое рекомендуется API.

Можно опубликовать сетевую службу со следующими шагами:

  1. Создайте сокет для прислушиваний к соединениям со службой. Посмотрите Запись Основанного на TCP Сервера в Сетях Тем Программирования для рекомендуемого способа прислушаться к соединениям на сетевом сокете.

  2. Создайте объект службы, обеспечив порт Вашего сокета, домен (обычно пустая строка), и строка типа службы Вашего выбора:

    • С Основой инициализируйте NSNetService объект с initWithDomain:type:name:port: метод.

    • С Базовой Основой создайте a CFNetServiceRef объект с CFNetServiceCreate функция.

    • С Открытием Службы DNS API вызвать DNSServiceRegister возвратить a DNSServiceRef объект.

  3. Присвойте делегата или обратный вызов:

    • С Основой присвойте делегата в NSNetService объект с delegate метод.

    • С Базовой Основой присвойте клиентский обратный вызов CFNetServiceRef объект с CFNetServiceSetClient функция.

    • С Открытием Службы DNS API необходимо передать клиентский обратный вызов (и, дополнительно, указатель на объект контекста выбора) в вызове к DNSServiceRegister. В этой точке Вы сделаны за исключением обработки обратных вызовов, когда они происходят.

  4. Запланируйте или перепланируйте службу, если необходимый:

    • С Основой служба автоматически планируется на текущий цикл выполнения в режиме по умолчанию. Если необходимо запланировать объект на другой цикл выполнения или в различном режиме, необходимо не запланировать его и перепланировать его в этой точке.

    • С Базовой Основой необходимо запланировать CFNetServicesRef объект на цикле выполнения путем вызова CFNetServiceScheduleWithRunLoop.

    • С Открытием Службы DNS API вызвать DNSServiceSetDispatchQueue запланировать службу на очередь отгрузки. (Если необходимо поддерживать OS до OS X v10.7, см. проект примера кода SRVResolver для примера того, как использовать Открытие Службы DNS без Центральной Отгрузки.)

  5. Опубликуйте службу, если необходимый:

    • С Основой опубликуйте службу путем вызова publish метод.

    • С Базовой Основой опубликуйте службу путем вызова CFNetServiceRegisterWithOptions.

    • С Открытием Службы DNS API никакие дальнейшие действия не необходимы; когда Вы вызвали, служба была уже опубликована DNSServiceRegister.

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

Просмотр для и соединение с сетевой службой

Процесс для нахождения и разрешения сетевой службы так же прост как процесс для публикации той. Для просмотра для сетевых служб в Objective C создайте экземпляр NSNetServiceBrowser класс и присваивает его делегат. Затем вызовите searchForServicesOfType:inDomain: метод на браузере службы. netServiceBrowser:didFindService:moreComing: метод делегата вызывают один раз для каждой найденной службы.

Для соединения со службой сначала остановите просмотр путем вызова stop (если у Вас нет определенной причины продолжить просматривать), затем вызовите getInputStream:outputStream: метод на NSNetService объект, представляющий службу. Адрес службы разрешен автоматически.

Можно также использовать CFStreamCreatePairWithSocketToNetService функция с a CFNetServiceRef возразите для соединения со службой Bonjour.

Разрешение сетевой службы

Вы, возможно, должны разрешить сетевую службу вручную для обеспечения адреса службы для API, не принимающего имена сетевой службы. Для разрешения сетевой службы в Objective C сначала остановите просмотр путем вызова stop (если у Вас нет определенной причины продолжить просматривать), затем вызовите resolveWithTimeout: метод на NSNetService объект, представляющий службу.

netServiceDidResolveAddress: когда адрес службы был разрешен, метод вызывают на делегате службы. Можно тогда получить доступ к имени хоста службы с hostName метод или его адресная информация с addresses метод. Для предотвращения ненужного сетевого трафика необходимо также вызвать stop на NSNetService возразите, как только это возвращает ряд адресов.

Мультиравноправный обзор связи

Мультиравноправная Платформа Связи обеспечивает уровень поверх Добрый день, позволяющий Вам связаться с приложениями, работающими на соседних устройствах (по Wi-Fi инфраструктуры, одноранговому Wi-Fi и Bluetooth), не имея необходимость писать много сетевого кода, определенного для Вашего приложения.

С Мультиравноправной Связью Ваше приложение распространяет свою доступность. Это может тогда обнаружить другие экземпляры Вашего приложения (или другие приложения, совместно использующие тот же тип службы), работа соседних устройств, и может пригласить те соседние коллеги присоединяться к сеансу. Если они принимают приглашение, Ваше приложение может отправить сообщения и файлы к один или больше связанных коллег только с вызовом отдельного метода.

При необходимости в коммуникации на основе потоков приложение может открыть однонаправленный поток для любой связанной коллеги (который может также открыть однонаправленный поток назад для приложения в ответ).

Наконец, Мультиравноправная Связь предоставляет возможность для совместного использования мелких сумм данных (таких как псевдоним пользователя) вне контекста сеанса, при желании разрешающего Вам предоставлять пользователю информацию, которую он или она может использовать при выборе коллег для приглашения в сеанс.

Узнавать больше

Мультиравноправная Связь — Мультиравноправная Ссылка Платформы Связи Чтения и проект примера кода MultipeerGroupChat.

Игровой Набор — Игровое Руководство по программированию Центра Чтения, Ссылка Платформы GameKit, и GKRocket и проекты примера кода GKTank.

NSNetService— Считайте Руководство по программированию NSNetServices и CFNetServices, Ссылку класса NSNetServiceBrowser, Ссылку на протокол NSNetServiceBrowserDelegate и Ссылку на протокол NSNetServiceDelegate. Для примера кода см. проект примера кода RemoteCurrency.

CFNetService— Считайте ссылку руководства по программированию и CFNetServices NSNetServices и CFNetServices.

Открытие службы DNS — чтение руководство по программированию открытия службы DNS и ссылка открытия C службы DNS.