NSStream 委托 NSStreamEventHasBytesAvailable 未被调用
Posted
技术标签:
【中文标题】NSStream 委托 NSStreamEventHasBytesAvailable 未被调用【英文标题】:NSStream Delegate NSStreamEventHasBytesAvailable Not Being Called 【发布时间】: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 的情况,因此永远不会收到来自服务器的消息。有人对此有任何解决方案吗?我在 *** 上找到了一些相关的问题,但没有一个得到解答。
提前致谢。
【问题讨论】:
有人知道吗? 我遇到了同样的问题。请改用github.com/robbiehanson/CocoaAsyncSocket。这很简单,对我有用。 代码中有错误:unsigned int len = [inputStream read:maxLength]
而read:maxLength
返回一个 NSInteger(-1 表示没有数据)。
【参考方案1】:
我只是在查看代码。尝试删除 NSInputStream 的委托。我正在调查另一个Using NSXMLParser initWithStream: no parser delegate methods received
处理类似情况。
【讨论】:
【参考方案2】:我不知道你问题的确切答案,但我知道你不应该打电话
[self auth];
在 NSStream 打开后立即。你必须等待
NSStreamEventHasSpaceAvailable
您的 NSOutputStream 的事件,然后仅在其中写入数据。
【讨论】:
以上是关于NSStream 委托 NSStreamEventHasBytesAvailable 未被调用的主要内容,如果未能解决你的问题,请参考以下文章