Как найти соединение для конкретного вызова метода распределенных объектов?

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

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

@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 ответ

То, что вы ищете, это методы делегирования 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

Другие вопросы по тегам