[英]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.