【问题标题】:NSStream Delegate NSStreamEventHasBytesAvailable Not Being CalledNSStream 委托 NSStreamEventHasBytesAvailable 未被调用
【发布时间】:2013-09-13 23:10:02
【问题描述】:

我正在编写一个消息应用程序,它使用 NSStream 与用 Python 编写的服务器进行通信。服务器与配套的 Python 客户端完美配合。但是当我用 NSStream 连接到它时, NSInputStream 似乎没有得到任何数据。然而,NSOutputStream 可以完美运行。我像这样打开字符串:

-(void)openStream
{
    CFReadStreamRef readStream;
    CFWriteStreamRef writeStream;
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"tihmstar.dyndns.org", 80,       &readStream, &writeStream);

    inputStream = (__bridge_transfer NSInputStream *)readStream;
    outputStream = (__bridge_transfer NSOutputStream *)writeStream;
    [inputStream setDelegate:self];
    [outputStream setDelegate:self];
    [inputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
    [outputStream scheduleInRunLoop:[NSRunLoop mainRunLoop] forMode:NSDefaultRunLoopMode];
    [inputStream open];
    [outputStream open];

    [self auth];
    [[NSNotificationCenter defaultCenter] postNotificationName:@"InitCompleted" object:nil];
}

委托方法是这样的:

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent
    {
        NSLog(@"Handle Event - ");
        switch (streamEvent)
        {
            case NSStreamEventOpenCompleted:
                NSLog(@"Stream opened");
                break;

            case NSStreamEventHasBytesAvailable:
                NSLog(@"Bytes Available!");
                if(theStream == inputStream)
                {
                    NSLog(@"inputStream is ready.");

                    uint8_t buf[1024];
                    unsigned int len = 0;

                    len = [inputStream read:buf maxLength:1024];

                    if(len > 0)
                    {
                        NSMutableData* data=[[NSMutableData alloc] initWithLength:0];

                        [data appendBytes: (const void *)buf length:len];

                        NSString* string = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding];
                        NSLog(@"Server said- %@", string);
                        [self messageReceived:[string lowercaseString]];
                    }
                }
                break;

            case NSStreamEventErrorOccurred:
                NSLog(@"Can not connect to the host!");
                break;

            case NSStreamEventEndEncountered:
                NSLog(@"End Encountered");
                break;

            case NSStreamEventHasSpaceAvailable:
                NSLog(@"Space Availible.");
                break;

            default:
                NSLog(@"Unknown event- %u", streamEvent);
        }
    }

我的问题是永远不会调用 NSStreamEventHasBytesAvailable 的情况,因此永远不会收到来自服务器的消息。有人对此有任何解决方案吗?我在 StackOverflow 上找到了一些相关的问题,但没有一个得到解答。

提前致谢。

【问题讨论】:

  • 有人知道吗?
  • 我遇到了同样的问题。请改用github.com/robbiehanson/CocoaAsyncSocket。这很简单,对我有用。
  • 代码中有错误:unsigned int len = [inputStream read:maxLength]read:maxLength 返回一个 NSInteger(-1 表示没有数据)。

标签: ios objective-c sockets nsstream


【解决方案1】:

我只是在查看代码。尝试删除 NSInputStream 的委托。我正在调查另一个Using NSXMLParser initWithStream: no parser delegate methods received

处理类似情况。

【讨论】:

    【解决方案2】:

    我不知道你问题的确切答案,但我知道你不应该打电话

    [self auth];
    

    在 NSStream 打开后立即。你必须等待

    NSStreamEventHasSpaceAvailable
    

    您的 NSOutputStream 的事件,然后仅在其中写入数据。

    【讨论】:

      猜你喜欢
      • 2015-11-15
      • 2023-03-07
      • 1970-01-01
      • 2010-12-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-02-09
      • 1970-01-01
      相关资源
      最近更新 更多