簡體   English   中英

NSSocketPort端口只能以一種方式工作

[英]NSSocketPort port only works one way

我正在嘗試使用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" ,但是當客戶端設置"clientSet : Value"后讓服務器讀取[self.conn rootProxy] ,服務器將獲得一個包含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返回到服務器? 我怎樣才能做到這一點?

我設法通過實現實現NSCoding協議的類並將其用作rootObject來解決此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上創建一個委托並將其分配給我的客戶端,這使得服務器向客戶端提供進度信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM