Конфигурирование соединения

Можно управлять некоторыми факторами распределенной коммуникации объектов путем конфигурирования 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];