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 端口只能以一种方式工作的主要内容,如果未能解决你的问题,请参考以下文章

ios视频​​上的Phonertc只能以一种方式工作

python SQLAlchemy多对多唯一约束仅以一种方式工作

如何以一种用户只能访问一个站点的方式在 Ubuntu 上配置虚拟主机 [关闭]

Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试

Django幺蛾子之Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试。

Error: [WinError 10013] 以一种访问权限不允许的方式做了一个访问套接字的尝试