Как найти соединение для конкретного вызова метода распределенных объектов?
У меня есть клиентское и серверное приложение Какао, которое общается с помощью распределенных объектов, реализованных через 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