Конфигурирование соединения
Можно управлять некоторыми факторами распределенной коммуникации объектов путем конфигурирования NSConnection
объекты. Можно установить тайм-ауты для ограничения количества времени NSConnection
объект ожидает на удаленном сообщении, установите режим, на котором он ждет запросов и ответов, и управляйте как NSConnection
объект управляет многократными удаленными сообщениями. В дополнение к этим установкам параметров можно измениться NSConnection
зарегистрированное имя объекта или корневой объект для динамического изменения Вашего распределенного приложения.
NSConnection
возразите использует два вида тайм-аутов, один для исходящих сообщений и один для ответов. Исходящее сетевое сообщение может занять время для отправки. Как только это выходит, обычно существует задержка, прежде чем поступит любое возвращаемое значение. Если любая из этих операций превышает свой тайм-аут, NSConnection
возразите повышает NSPortTimeoutException
. Можно установить значения для этих тайм-аутов с setRequestTimeout:
и setReplyTimeout:
сообщения, соответственно. По умолчанию эти тайм-ауты установлены в максимальное возможное значение.
NSConnection
объекты, продающие объекты, ждут новых запросов на установление соединения в NSDefaultRunLoopMode
(как определено NSRunLoop
класс). Когда NSConnection
объект отсылает удаленное сообщение, он ждет возвращаемого значения в NSConnectionReplyMode
. Вы не можете изменить этот режим, но можно использовать его для установки NSTimer
объекты или другие входные механизмы, которые должны быть обработаны при ожидании ответов на удаленные сообщения. Использовать addRequestMode:
добавить входные механизмы для этого режима.
Обычно NSConnection
объект передает удаленные сообщения к их предполагаемым получателям, поскольку он получает их. Если Ваше приложение возвращается к циклу выполнения или использует распределенные объекты любой прямо или косвенно, это может получить удаленное сообщение, в то время как это уже занято, обрабатывая другого. Предположим, что сервер обрабатывает удаленное сообщение и отправляет сообщение в другое приложение через распределенные объекты. Если другое приложение отправляет сообщение в сервер, NSConnection
возразите сразу вперед ему против предполагаемого получателя, даже при том, что сервер также ждет ответа на исходящее сообщение. Это поведение может вызвать проблемы, если удаленное сообщение вызывает долгое изменение в состоянии серверного приложения, представляющем его противоречивый какое-то время: Другие удаленные сообщения могут вмешаться в это состояние, или получение неправильных результатов или повреждение состояния серверного приложения. Можно выключить это поведение с setIndependentConversationQueueing:
метод, так, чтобы только одному удаленному сообщению позволили иметь силу в любое время в NSConnection
поток объекта. Когда независимая организация очередей разговора включена, NSConnection
объект передает входящие удаленные сообщения только, когда никакие другие удаленные сообщения не обрабатываются в его потоке. Это только влияет на сообщения между объектами, не запросы на новые соединения; в любое время могут быть сформированы новые соединения.
Один другой способ сконфигурировать именованное NSConnection
объект состоит в том, чтобы изменить свое имя или корневой объект. Это эффективно изменяет объект, что приложения получают использование методов, описанных в Получении Продаваемого Объекта, но не изменяет прокси, которые уже получили другие приложения. Вы могли бы использовать этот метод для полевого обновления распределенное приложение с улучшенным классом серверный объекта. Например, для установки нового серверного процесса имеют старый, изменяют его имя, возможно от “Аналитического Сервера” к “Старому Аналитическому Серверу”. Это скрывает его от клиентов, пытающихся установить новые соединения, но позволяет его корневому объекту служить существующим соединениям (когда те соединения близко, старые выходы серверного процесса). Тем временем запустите новый сервер, требующий имени “Аналитический Сервер” так, чтобы новые запросы на исследования связались с обновленным объектом.
Обратите внимание на то, что для коммуникации межузла, Вы не можете использовать соединение по умолчанию, значение по умолчанию NSPort
подкласс или сервер имен порта по умолчанию. Необходимо использовать NSPort
подкласс, поддерживающий коммуникацию межмашины, такой как NSSocketPort
. Вы могли бы сконфигурировать сервер как показано в следующем фрагменте кода.
NSSocketPort *port = [[NSSocketPort alloc] init]; |
NSConnection *connection = [NSConnection connectionWithReceivePort:port sendPort:nil]; |
[[NSSocketPortNameServer sharedInstance] registerPort:port name:@"doug"]; |
Вы тогда сконфигурировали бы клиент следующим образом.
NSSocketPort *port = [[NSSocketPortNameServer sharedInstance] portForName:@"doug" host:@"*"]; |
NSConnection *connection = [NSConnection connectionWithReceivePort:nil sendPort:port]; |