【发布时间】:2023-03-07 11:52:01
【问题描述】:
我正在努力解决 NSStream 委托的问题。
我的应用程序创建并打开 10 个并发 TCP 客户端,并连接到我正在控制的设备中的 10 个 TCP 服务器。 我正在创建 10 个套接字,每个套接字都有自己独特的输入和输出流。 它们都反馈给一个流委托来处理流事件。
我能够毫无问题地在所有 10 个套接字上连接和通信。
但是,当我拔下一台或多台服务器时,iPad 上的连接仍显示其状态为已建立,并且 [outputStream status] 消息返回 2。
我希望流在服务器断开连接时显示错误事件,但这似乎没有发生。
这是我通过将多个流连接到单个委托而做错了什么,还是有其他更根本的问题?
我设置委托的套接字创建示例:
-(void)connectToHub0 {
launchflag = 1;
NSLog(@"trying to connect to hub 0");
/
UInt32 port;
port = 40000;
launchTimer = [NSTimer scheduledTimerWithTimeInterval:5.0 target:self selector:@selector (launchTimeOut:) userInfo:nil repeats:NO];
Hub *currentHub = [Hubs objectAtIndex:0];
/
CFReadStreamRef readStream;
CFWriteStreamRef writeStream;
CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)currentHub.ipAddress, port, &readStream, &writeStream);
inputStream = (__bridge NSInputStream *)readStream;
outputStream = (__bridge NSOutputStream *)writeStream;
[inputStream setDelegate:self];
[outputStream setDelegate:self];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream open];
[outputStream open];
}
委托在我的viewController.m 中设置为:
@interface viewController()<NSStreamDelegate>
【问题讨论】:
-
你在哪里读取流状态?断开连接不会调用 NSStreamDelegate
stream:handleEvent:方法(带有特定事件(NSStreamEvent如NSStreamEventEndEncountered或NSStreamEventErrorOccurred)? -
这就是我所期待的,但我没有看到那些特定的事件,我似乎只是得到了 NSStreamHasSpaceAvailable 事件。由于并行连接,我不会复制整个流处理程序,因为它非常大,但我将其初始化为: - (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent { switch (streamEvent) { 但是EndEncountered 或 ErrorOccurred 处的断点永远不会触发。
标签: ios objective-c sockets tcp delegates