Архитектура сетевых служб основы

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

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

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

NSNetServiceBrowser

NSNetServiceBrowser класс имеет две цели: просмотр для служб и просмотр для доменов Bonjour. В любой момент времени, сингл NSNetServiceBrowser объект может выполнить самое большее одну поисковую работу; если необходимо искать многократные типы служб сразу, используйте многократный NSNetServiceBrowser объекты.

При просмотре для определенного типа службы — например, поиске служб FTP на локальную сеть — этот класс предоставляет Вам заполненные экземпляры NSNetService для каждой удаленной службы.

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

NSNetService

NSNetService класс представляет единственную службу (или удаленная служба, которую Ваше приложение хочет использовать или локальная служба, которую Ваше приложение публикует). Экземпляры этого класса вовлечены во все операции Bonjour, описанные в этой главе.

NSNetService объекты, представляющие удаленные службы, прибывают предварительно инициализированные с именем службы, вводят, и домен, но никакое имя хоста, IP-адрес или номер порта. Имя, введите, и домен используется, чтобы разрешить, что экземпляр в информацию должен был соединиться со службой (IP-адреса и номер порта) по запросу.

NSNetService объекты, используемые для публикации локальных служб к сети, должны быть инициализированы (Вашим кодом) с именем службы, ввести, домен и номер порта. Добрый день использование эта информация для объявления о доступности службы по сети.

Теория работы

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

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

Публикация

NSNetService класс обрабатывает публикацию службы. Опубликовать службу:

  1. Приложение устанавливает сокет и начинает прислушиваться к входящим соединениям на том сокете, как описано в Сетях Тем Программирования.

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

  3. Приложение отправляет сообщение в NSNetService объект, запрашивая, чтобы служба быть опубликованной к сети и публикации продолжилась асинхронно.

  4. NSNetService вызовы объектов его делегат с информацией о состоянии публикации.

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

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

Открытие службы

Обнаружить службы распространилось в сети, Вы используете NSNetServiceBrowser класс, как показано на рисунке 1-1.

  Открытие Службы рисунка 1-1 с NSNetServiceBrowser
Service discovery with NSNetServiceBrowser

На шаге 1 приложение инициализирует NSNetServiceBrowser возразите и связывает объект делегата с ним. На шаге 2, NSNetServiceBrowser поиски объектов асинхронно служб. На шаге 3 результаты возвращаются к объекту делегата в форме NSNetService объекты.

Шаг 3 обычно происходит многократно. Первоначально, браузер вызывает Вас один раз для каждой службы, о которой он в настоящее время знает. Когда это вызывает Ваш метод делегата с последней из этих в настоящее время известных служб, это передает NO для moreComing параметр.

Однако, потому что объект браузера продолжает просматривать, пока Ваше приложение явно не говорит ему останавливаться, Ваш делегат узнает о новых службах, поскольку они прибывают онлайн, и узнает об исчезновении служб, поскольку они закрываются. В результате Ваш didFindService:moreComing: метод можно вызвать с новыми службами даже после того, как Вы получите a moreComing значение NO.

Для поэтапных инструкций открытия службы и отрывков примера кода, считайте Просмотр для Сетевых служб.

Соединение со службами

Для соединения с Добрый день распространенной службой приложение обычно вызывает метод такой как getInputStream:outputStream:, который обеспечивает поток или пару потоков для связи со службой (как показано на рисунке 1-2). Когда приложение открывает тот поток, сам потоковый объект соединяется со службой Bonjour таким же образом, что это соединилось бы при передаче его имя хоста. Потоковый объект, в свою очередь, использование NSNetService объект выполнить поиски DNS от своего лица.

Рисунок 1-2  , соединяющийся с добрый день службой (NSNetService)

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

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

Разрешение служб вручную

Когда Вы соединяетесь со службой путем вызова метода подключения к службе такой как, в наиболее распространенном использовании разрешение выполняется прозрачно, также getInputStream:outputStream: или когда Вы позже повторно соединяетесь со службой с помощью имени, полученного путем вызова hostName на уже разрешенном объекте службы.

Если по некоторым причинам необходимо знать фактические IP-адреса для службы, можно также спросить объект разрешить имя службы явно. Чтобы препятствовать тому, чтобы Ваше приложение замедлилось, разрешение имеет место асинхронно, возвращая результаты или сообщения об ошибках к NSNetService делегат объекта. Если допустимые адреса были найдены для службы, Ваше приложение может использовать их для создания сокетного соединения.

Рисунок 1-3 иллюстрирует этот процесс.

  Разрешение Службы рисунка 1-3 с NSNetService
Service resolution with NSNetService

На шаге 1 приложение или явно инициализирует или иначе получает NSNetService экземпляр для службы — в этом случае локальная переменная music службу по TCP вызывают Ed's Party Mix. На шаге 2, NSNetService объект получает a resolve сообщение. Разрешение продолжается асинхронно, и в некоторый момент оно получает IP-адрес и номер порта для службы (169.254.150.84:1010). На шаге 3 делегат уведомляется, и на шаге 4, делегат спрашивает NSNetService объект для списка адресов и номера порта. Служба может иметь многократные IP-адреса, но всегда имеет точно один порт.

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