如何正确管理多个插座的开关?

时间:2014-09-30 11:17:48

标签: ios objective-c sockets

我知道如何在socket中打开objective-c以及如何发送和接收data。我总是使用简单的开放方法和socket方法创建object处理程序callback。像这样:

+ (void)openWithUrl:(NSString *)url {
    @try {
        CFReadStreamRef readStream;
        CFWriteStreamRef writeStream;
        CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)url, 9443, &readStream, &writeStream);
        CFReadStreamSetProperty(readStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);
        CFWriteStreamSetProperty(writeStream, kCFStreamNetworkServiceType, kCFStreamNetworkServiceTypeVoIP);

        inputStream = (__bridge NSInputStream *)readStream;
        outputStream = (__bridge NSOutputStream *)writeStream;

        NSMutableDictionary *sslSettings = [[NSMutableDictionary alloc] init];
        [sslSettings setObject:NSStreamSocketSecurityLevelNegotiatedSSL forKey:(NSString *)kCFStreamSSLLevel];
        [sslSettings setObject:(id)kCFBooleanTrue forKey:(NSString *)kCFStreamSSLAllowsAnyRoot];
        [sslSettings setObject:url forKey:(NSString *)kCFStreamSSLPeerName];
        [inputStream setProperty:sslSettings forKey:(NSString *)kCFStreamPropertySSLSettings];
    }
    @catch (NSException *e) {
        NSLog(@"exception: %@",e);
    }

    @try {
        [inputStream setDelegate:static_self];
        [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [inputStream open];

        [outputStream setDelegate:static_self];
        [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
        [outputStream open];
    }
    @catch (NSException *e) {
        NSLog(@"exception: %@",e);
    }
}

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent {
    dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_HIGH, 0), ^{
        NSError *theError = [theStream streamError];

        if (theError == NULL) {
            switch (streamEvent) {
                case NSStreamEventOpenCompleted: {
                    break;
                }

                case NSStreamEventHasBytesAvailable: {
                    //handle incoming data here
                    break;
                }

                case NSStreamEventHasSpaceAvailable: {
                    //send some data here
                    break;
                }

                case NSStreamEventErrorOccurred: {
                    break;
                }

                case NSStreamEventEndEncountered: {
                    break;
                }

                default: {
                    break;
                }
            }
        }
    });
}

非常简单。现在,对于voip app我正在制作,我使用了signaling server,要求我使用两个sockets进行连接。

  • 一个control socket来发送数据。需要打开socket, 发送了一些data,然后再次关闭。收到回复后 在服务器上,我关闭socket并打开下一个。

  • 一个waiting socket收到data。这个是在之后打开的 control socket完成了。我打开这个socket并发送一个等待 signal到服务器,只要服务器有话要说 我(有人打电话,有人联系/断开等等),他 在此data上发送waiting socket。如果我需要再次打开control socket以自行发送一些数据,我会关闭waiting socket 并在control socket完成后打开。

我尝试使用我以前的方式,我很久以前就把它粘贴了,并且它总是很好。但是,我觉得用sockets管理正在发生的事情变得越来越困难。因为它们一直打开和关闭我有时会错过数据包。我也无法在短时间内发送大量消息,因为socket在发送data之前关闭(重新打开)。

我该如何处理?是否有design pattern允许我像上面描述的那样使用两个sockets?我宁愿不使用third party libraries,除非没有别的办法。

0 个答案:

没有答案