【问题标题】:NSStream delegate not firing errorsNSStream 委托未触发错误
【发布时间】: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: 方法(带有特定事件(NSStreamEventNSStreamEventEndEncounteredNSStreamEventErrorOccurred )?
  • 这就是我所期待的,但我没有看到那些特定的事件,我似乎只是得到了 NSStreamHasSpaceAvailable 事件。由于并行连接,我不会复制整个流处理程序,因为它非常大,但我将其初始化为: - (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent { switch (streamEvent) { 但是EndEncountered 或 ErrorOccurred 处的断点永远不会触发。

标签: ios objective-c sockets tcp delegates


【解决方案1】:

这是 TCP 套接字的正常行为。检测此类断开连接的一种方法是使用 keep-alive 数据包作为网络协议的一部分。

请参阅this interesting article 以获得更详细的答案。

【讨论】:

  • 这清除了很多东西。有趣的文章,非常感谢。
猜你喜欢
  • 1970-01-01
  • 2015-11-27
  • 1970-01-01
  • 2015-11-15
  • 2023-04-11
  • 2018-11-27
  • 1970-01-01
  • 1970-01-01
  • 2012-08-27
相关资源
最近更新 更多