Порт NSSocketPort работает только в одну сторону
Я пытаюсь создать соединение между двумя приложениями на одном компьютере с NSSocketPort
, но это только кажется, что работает в одну сторону. У меня есть сервер, который создает NSMutableDictionary
и устанавливает его как rootObject
, Клиент читает rootProxy
и получает словарь, как его создал сервер. Но затем я хочу, чтобы клиент добавил дополнительный словарь / значение в словарь и установил словарь как rootObject
снова. Но сервер, кажется, не получает последнее установленное значение / ключ после того, как клиент установил его.
Сервер:
self.portRecv = [[NSSocketPort alloc] initWithTCPPort:30028];
self.conn = [NSConnection connectionWithReceivePort:self.portRecv sendPort:nil];
self.data = [NSMutableDictionary dictionary];
[self.data setObject:@"Value" forKey:@"serverSet"];
self.conn.rootObject = self.data;
self.conn.delegate = self;
Вот как сервер читает значение:
self.data = (NSMutableDictionary*)[self.conn rootProxy];
Клиент:
self.portSend = [[NSSocketPort alloc] initRemoteWithTCPPort:30028 host:@"127.0.0.1"];
self.conn = [NSConnection connectionWithReceivePort:nil sendPort:self.portSend];
self.conn.delegate = self;
self.data = (NSMutableDictionary*)[self.conn rootProxy];
[self.data setObject:@"Value" forKey:@"clientSet"];
self.conn.rootObject = self.data;
Клиента self.data
получает "serverSet : Value"
просто отлично, но когда я позволяю серверу читать [self.conn rootProxy]
после того, как клиент установил "clientSet : Value"
сервер получает словарь с serverSet
значение, а не clientSet
,
Я отвечаю на сообщения делегата, как показано ниже:
- (BOOL)makeNewConnection:(NSConnection *)conn sender:(NSConnection *)ancestor
{
return YES;
}
- (BOOL)connection:(NSConnection *)ancestor shouldMakeNewConnection:(NSConnection *)conn
{
return YES;
}
- (BOOL)connection:(NSConnection *)conn handleRequest:(NSDistantObjectRequest *)doReq
{
NSInvocation *invocation = [doReq invocation];
[invocation invoke];
if ([invocation selector] == @selector(entitiesByName))
{
id retVal;
[invocation getReturnValue:&retVal];
NSDictionary *rebuilt = [NSDictionary dictionaryWithDictionary:retVal];
[invocation setReturnValue:&rebuilt];
}
[doReq replyWithException:nil];
return YES;
}
Должен ли я быть в состоянии добавить значение и вернуть rootObject
на сервер? Как я могу это сделать?
1 ответ
Мне удалось решить эту проблему путем реализации класса, который реализует NSCoding
протокол, а затем использовать это как rootObject
, Сделав это, я смог вызвать различные методы на объекте сервера от клиента.
Это закончилось так:
Сервер:
int port = 30012;
self.socketModel = [[SocketModel alloc] init];
self.socketModel.statusBarUiDelegate = self;
NSSocketPort* recvPort = [[NSSocketPort alloc] initWithTCPPort:port];
self.conn = [NSConnection connectionWithReceivePort:recvPort sendPort:nil];
[self.conn setRootObject:self.socketModel];
SocketModel:
@interface SocketModel : NSObject<NSCoding>
-(NSString*)performTask:(NSString*)data;
-(void)taskCompleted;
@end
Клиент:
NSString* data = @"pewpew";
NSSocketPort* recv = [[NSSocketPort alloc] initRemoteWithTCPPort:30012 host:@"127.0.0.1"];
self.conn = [NSConnection connectionWithReceivePort:nil sendPort:recv];
[self.conn setRequestTimeout:5];
NSString* result = nil;
SocketModel* obj = nil;
obj = (SocketModel*)[self.conn rootProxy];
result = [builderObj performTask:data];
[obj taskCompleted];
Я даже смог создать делегата на моем SocketModel
и назначить его моему клиенту, что заставило сервер предоставлять информацию о ходе выполнения клиенту.