繁体   English   中英

NSStream委托NSStreamEventHasBytesAvailable未被调用

[英]NSStream Delegate NSStreamEventHasBytesAvailable Not Being Called

我正在编写一个消息传递应用程序,它使用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上找到了一些相关的问题,但没有一个问题得到解答。

提前致谢。

我只是在查看代码。 尝试删除NSInputStream的委托。 我正在研究另一个使用NSXMLParser的initWithStream:没有收到任何解析器委托方法

处理类似的情况。

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

[self auth];

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

NSStreamEventHasSpaceAvailable

您的NSOutputStream的事件,之后只在其中写入数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM