Ios 如何正确管理多个插座的多次打开和关闭?

Ios 如何正确管理多个插座的多次打开和关闭?,ios,objective-c,sockets,Ios,Objective C,Sockets,我知道如何在objective-c中打开套接字,以及如何发送和接收数据。我总是用一个简单的open方法和一个回调方法创建一个套接字处理程序对象。大概是这样的: + (void)openWithUrl:(NSString *)url { @try { CFReadStreamRef readStream; CFWriteStreamRef writeStream; CFStreamCreatePairWithSocketToHost(NULL

我知道如何在
objective-c
中打开
套接字
,以及如何发送和接收
数据
。我总是用一个简单的open方法和一个回调方法创建一个
套接字
处理程序
对象
。大概是这样的:

+ (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应用程序
,我正在使用一个
信令
服务器
,它要求我使用两个
套接字进行连接

  • 一个
    控制插座
    发送数据。需要打开此
    插座
    , 发送了一些
    数据
    ,然后再次关闭。在收到来自 在服务器上,我关闭
    套接字
    ,然后打开下一个

  • 一个
    等待套接字
    接收
    数据
    。这一个是在会议结束后打开的
    控制插座
    完成。我打开这个
    套接字
    ,然后发送等待消息
    向服务器发送信号
    ,只要服务器有话要说 我(有人在打电话,有人已连接/断开连接等),他 在此等待套接字上发送
    数据
    。如果我需要打开
    控件
    socket
    为了自己发送一些数据,我关闭了等待的socket
控制套接字
完成后,它将被打开

我试着用我的老方法,我复制粘贴了很久以前的东西,它一直都很好。然而,我觉得越来越难管理
sockets
。因为它们总是打开和关闭,我有时会错过包。我也不能在短时间内发送很多消息,因为
套接字在发送
数据之前会关闭(重新打开)


我该怎么处理?是否有一个
设计模式
,允许我使用两个
插座
,就像我上面描述的那样?除非没有其他方法,否则我宁愿不使用第三方库。

请不要对非代码的内容使用代码格式。这让你的问题令人难以置信地痛苦/难以阅读。此外,您的问题还不清楚为什么需要关闭套接字?@sapi我不确定您在哪里看到非代码的代码格式,因为我看不到。。。我还解释了为什么需要关闭套接字,因为服务器协议需要它。