Порт 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 и назначить его моему клиенту, что заставило сервер предоставлять информацию о ходе выполнения клиенту.

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