我知道如何在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
,除非没有别的办法。