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我不确定您在哪里看到非代码的代码格式,因为我看不到。。。我还解释了为什么需要关闭套接字,因为服务器协议需要它。