Как найти соединение для конкретного вызова метода распределенных объектов? - PullRequest
4 голосов
/ 11 июня 2011

У меня есть клиентское и серверное приложение Какао, которое взаимодействует с помощью распределенных объектов, реализованных через NSSocketPorts и NSConnections стандартным способом.Сервер передает один объект клиентским приложениям, которых может быть несколько.Каждое клиентское приложение может получить доступ к одному и тому же распределенному объекту, получая свой собственный прокси.

Обтекаемый объект поддерживает определенный протокол, который включает метод, подобный следующему:

@protocol VendedObjectProtocol
- (void) acquireServerResource:(ServerResourceID)rsc;
@end

Когдаклиентское приложение вызывает этот метод, сервер должен выделить запрошенный ресурс для этого клиентского приложения.Но может быть несколько клиентов, которые запрашивают один и тот же ресурс, и сервер должен отслеживать, какие клиенты его запрашивали.

Что я хотел бы сделать на стороне сервера, так это определить используемую NSConnection.по вызову метода клиента.Как я могу это сделать?

Один из способов, о котором я подумал, заключается в следующем (на стороне сервера):

- (void) acquireServerResource:(ServerResourceID)rsc withDummyObject:(id)dummy {
    NSConnection* conn = [dummy connectionForProxy];
    //  Map the connection to a particular client
    //  ...
}

Однако я не хочу, чтобы клиент проходил черезфиктивный объект без реальной цели (с точки зрения клиента).Я мог бы сделать ServerResourceID классом, чтобы он передавался через прокси-сервер, но я тоже не хочу этого делать.

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

Может кто-нибудь предложить механизм для этого?

1 Ответ

0 голосов
/ 14 июня 2011

То, что вы ищете, это NSConnection делегат методов. Например:

- (BOOL)connection:(NSConnection *)parentConnection shouldMakeNewConnection:(NSConnection *)newConnnection {
 // setup and map newConnnection to a particular client 
 id<VendedObjectProtocol> obj = //...
 obj.connection = newConnection;
 return YES;
}

Вы можете спроектировать объект для каждого отдельного соединения (например, VendedObjectProtocol) и получить соединение с помощью self.connection.

- (void) acquireServerResource:(ServerResourceID)rsc {
    NSConnection* conn = self.connection;
    //  Map the connection to a particular client
    //  ...
}

Или

Вы можете использовать токены разговора, используя + createConversationForConnection : и + currentConversation

...