首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >未调用NSStream委派NSStreamEventHasBytesAvailable

未调用NSStream委派NSStreamEventHasBytesAvailable
EN

Stack Overflow用户
提问于 2013-09-14 07:10:02
回答 2查看 4.4K关注 0票数 3

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

代码语言:javascript
复制
-(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];
}

委托方法是这样的:

代码语言:javascript
复制
- (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);
        }
    }

我的问题是case NSStreamEventHasBytesAvailable永远不会被调用,因此永远不会收到来自服务器的消息。有人对此有什么解决方案吗?我在StackOverflow上发现了一些相关的问题,但都没有得到回答。

提前谢谢。

EN

回答 2

Stack Overflow用户

发布于 2013-12-29 14:26:07

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

来处理类似的情况。

票数 1
EN

Stack Overflow用户

发布于 2014-06-17 13:06:05

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

代码语言:javascript
复制
[self auth];

NSStream之后马上开张。你必须等待

代码语言:javascript
复制
NSStreamEventHasSpaceAvailable

事件,并仅在之后在其中写入数据。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18796556

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档