我正在编写一个消息传递应用程序,它使用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);
}
}我的问题是case NSStreamEventHasBytesAvailable永远不会被调用,因此永远不会收到来自服务器的消息。有人对此有什么解决方案吗?我在StackOverflow上发现了一些相关的问题,但都没有得到回答。
提前谢谢。
发布于 2013-12-29 14:26:07
我只是在看代码。尝试删除NSInputStream的委派。我在调查另一个Using NSXMLParser initWithStream: no parser delegate methods received
来处理类似的情况。
发布于 2014-06-17 13:06:05
我不知道你的问题的确切答案,但我很清楚你不应该打电话给
[self auth];NSStream之后马上开张。你必须等待
NSStreamEventHasSpaceAvailable事件,并仅在之后在其中写入数据。
https://stackoverflow.com/questions/18796556
复制相似问题