Архитектура сетевых служб основы
Архитектура для Добрый день сетевых служб в платформе Основы разработана так, чтобы Вы не должны были понимать подробные данные управления записью DNS, вместо этого позволяя Вам управлять службами с точки зрения четырех фундаментальных операций, определенных для Добрый день сетевых служб:
Распространяя службу, процесс, известный как публикация
Просмотр для доступных служб, также названных открытием службы
Соединение со службами непосредственно (предпочтительный метод)
Разрешение служб (переводящий службу называет во что-то, что позволяет Вам соединиться с ними),
Классы открытия службы основы
Для поддержки этих операций платформа Основы определяет два класса — тот, который Вы используете для просмотра для служб и доменов и той, представляющей отдельную службу.
NSNetServiceBrowser
NSNetServiceBrowser
класс имеет две цели: просмотр для служб и просмотр для доменов Bonjour. В любой момент времени, сингл NSNetServiceBrowser
объект может выполнить самое большее одну поисковую работу; если необходимо искать многократные типы служб сразу, используйте многократный NSNetServiceBrowser
объекты.
При просмотре для определенного типа службы — например, поиске служб FTP на локальную сеть — этот класс предоставляет Вам заполненные экземпляры NSNetService
для каждой удаленной службы.
При просмотре для доменов, предоставляет ли для регистрации или просмотра, этот класс Вам список доступных доменных имен. (Обратите внимание на то, что доменный просмотр выходит за рамки этой главы. Для поэтапных инструкций и примеров кода о доменном просмотре и руководства о том, как использовать просмотр в Вашем коде, читают Просмотр для Доменов.)
NSNetService
NSNetService
класс представляет единственную службу (или удаленная служба, которую Ваше приложение хочет использовать или локальная служба, которую Ваше приложение публикует). Экземпляры этого класса вовлечены во все операции Bonjour, описанные в этой главе.
NSNetService
объекты, представляющие удаленные службы, прибывают предварительно инициализированные с именем службы, вводят, и домен, но никакое имя хоста, IP-адрес или номер порта. Имя, введите, и домен используется, чтобы разрешить, что экземпляр в информацию должен был соединиться со службой (IP-адреса и номер порта) по запросу.
NSNetService
объекты, используемые для публикации локальных служб к сети, должны быть инициализированы (Вашим кодом) с именем службы, ввести, домен и номер порта. Добрый день использование эта информация для объявления о доступности службы по сети.
Теория работы
Поскольку обнаружение сети может занять много времени для завершения, NSNetService
и NSNetServiceBrowser
классы выполняют все свои операции асинхронно. Методы, предоставленные NSNetService
и NSNetServiceBrowser
возвратитесь сразу. В то время как сетевые операции имеют место, в результате Ваше приложение может продолжать выполняться.
Оба класса требуют объектов делегата в Вашем приложении, которое должно реализовать надлежащие методы для обработки получающихся данных. В некоторых случаях эти классы могут вызвать Ваши методы делегата несколько раз, предоставив дополнительные данные с каждым вызовом.
Публикация
NSNetService
класс обрабатывает публикацию службы. Опубликовать службу:
Приложение устанавливает сокет и начинает прислушиваться к входящим соединениям на том сокете, как описано в Сетях Тем Программирования.
Приложение инициализирует
NSNetService
объект, обеспечивая номер порта, имя службы и доменную информацию, и затем устанавливает объект делегата получить результаты. Объект автоматически планирует себя с текущим циклом выполнения.Приложение отправляет сообщение в
NSNetService
объект, запрашивая, чтобы служба быть опубликованной к сети и публикации продолжилась асинхронно.NSNetService
вызовы объектов его делегат с информацией о состоянии публикации.
Когда служба была успешно опубликована, делегат уведомляется. Если сбои публикации по какой-либо причине, делегат также уведомляется, вместе с надлежащей информацией об ошибке. Если публикация продолжается успешно, никакие дальнейшие сообщения не отправляются делегату.
Для поэтапных инструкций и примеров кода о публикации службы, посмотрите Сетевые службы Публикации.
Открытие службы
Обнаружить службы распространилось в сети, Вы используете NSNetServiceBrowser
класс, как показано на рисунке 1-1.
На шаге 1 приложение инициализирует NSNetServiceBrowser
возразите и связывает объект делегата с ним. На шаге 2, NSNetServiceBrowser
поиски объектов асинхронно служб. На шаге 3 результаты возвращаются к объекту делегата в форме NSNetService
объекты.
Шаг 3 обычно происходит многократно. Первоначально, браузер вызывает Вас один раз для каждой службы, о которой он в настоящее время знает. Когда это вызывает Ваш метод делегата с последней из этих в настоящее время известных служб, это передает NO
для moreComing
параметр.
Однако, потому что объект браузера продолжает просматривать, пока Ваше приложение явно не говорит ему останавливаться, Ваш делегат узнает о новых службах, поскольку они прибывают онлайн, и узнает об исчезновении служб, поскольку они закрываются. В результате Ваш didFindService:moreComing:
метод можно вызвать с новыми службами даже после того, как Вы получите a moreComing
значение NO
.
Для поэтапных инструкций открытия службы и отрывков примера кода, считайте Просмотр для Сетевых служб.
Соединение со службами
Для соединения с Добрый день распространенной службой приложение обычно вызывает метод такой как getInputStream:outputStream:
, который обеспечивает поток или пару потоков для связи со службой (как показано на рисунке 1-2). Когда приложение открывает тот поток, сам потоковый объект соединяется со службой Bonjour таким же образом, что это соединилось бы при передаче его имя хоста. Потоковый объект, в свою очередь, использование NSNetService
объект выполнить поиски DNS от своего лица.
Несмотря на то, что шаги выше описывают рекомендуемый способ соединиться с Добрый день распространенной службой, можно также соединиться двумя другими способами:
Путем разрешения
NSNetService
объект и затем выяснениеNSNetService
объект обеспечить имя хоста службы, затем передавая то имя хоста подключению по имени API.Путем выяснения
NSNetService
возразите для разрешения службы к ряду IP-адресов (как описано в Resolving Services Вручную), и затем пытающийся соединиться с узлом сами. Этому методу обескураживают, однако, из-за сложности, вызванной размещением в разных сетях.
Для поэтапных инструкций соединения услуг и отрывков примера кода, считайте Соединение с и Контроль Сетевых служб.
Разрешение служб вручную
Когда Вы соединяетесь со службой путем вызова метода подключения к службе такой как, в наиболее распространенном использовании разрешение выполняется прозрачно, также getInputStream:outputStream:
или когда Вы позже повторно соединяетесь со службой с помощью имени, полученного путем вызова hostName
на уже разрешенном объекте службы.
Если по некоторым причинам необходимо знать фактические IP-адреса для службы, можно также спросить объект разрешить имя службы явно. Чтобы препятствовать тому, чтобы Ваше приложение замедлилось, разрешение имеет место асинхронно, возвращая результаты или сообщения об ошибках к NSNetService
делегат объекта. Если допустимые адреса были найдены для службы, Ваше приложение может использовать их для создания сокетного соединения.
Рисунок 1-3 иллюстрирует этот процесс.
На шаге 1 приложение или явно инициализирует или иначе получает NSNetService
экземпляр для службы — в этом случае локальная переменная music
службу по TCP вызывают Ed's Party Mix
. На шаге 2, NSNetService
объект получает a resolve
сообщение. Разрешение продолжается асинхронно, и в некоторый момент оно получает IP-адрес и номер порта для службы (169.254.150.84:1010
). На шаге 3 делегат уведомляется, и на шаге 4, делегат спрашивает NSNetService
объект для списка адресов и номера порта. Служба может иметь многократные IP-адреса, но всегда имеет точно один порт.
Для поэтапных инструкций разрешения службы и отрывков примера кода, считайте Соединение с и Контроль Сетевых служб.