NSSocketPort 端口只能以一种方式工作
Posted
技术标签:
【中文标题】NSSocketPort 端口只能以一种方式工作【英文标题】:NSSocketPort port only works one way 【发布时间】:2014-04-16 08:14:37 【问题描述】:我正在尝试使用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
返回到服务器吗?我该怎么做?
【问题讨论】:
好吧,我也有同样的问题 @DenisKohl 我实际上找到了解决问题的有效方法。我已经创建它作为答案:-) 【参考方案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
上创建一个委托并将其分配给我的客户端,这使得服务器向客户端提供进度信息。
【讨论】:
以上是关于NSSocketPort 端口只能以一种方式工作的主要内容,如果未能解决你的问题,请参考以下文章
python SQLAlchemy多对多唯一约束仅以一种方式工作
如何以一种用户只能访问一个站点的方式在 Ubuntu 上配置虚拟主机 [关闭]
Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试
Django幺蛾子之Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。