0

を使用して、同じコンピューター上の 2 つのアプリケーション間の接続を作成しようとしていますが、NSSocketPort一方向にしか機能していないようです。NSMutableDictionaryを作成して として設定するサーバーがありますrootObjectrootProxyクライアントは、サーバーが作成した辞書を読み取り、辞書を取得します。しかし、クライアントに追加のキー/値セットを辞書に追加して、辞書を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"serverSetclientSet

私は以下のようにデリゲートメッセージに答えています:

- (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値を追加してサーバーに返すことはできませんか? どうやってやるの?

4

1 に答える 1

0

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];

ソケットモデル:

@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してクライアントに割り当てることもできました。これにより、サーバーは進行状況情報をクライアントに提供しました。

于 2014-09-22T07:27:50.233 に答える