【问题标题】:Trouble using NSInputStream使用 NSInputStream 遇到问题
【发布时间】:2014-01-21 16:09:41
【问题描述】:

尝试编写基本 iPhone 应用程序的新手。我为服务器编写了代码,可以从我的应用程序向服务器发送线路,但我无法从服务器接收线路。

此外,这个应用程序似乎只有在我使用调试器运行它时才能工作。

感谢任何帮助。谢谢。

这是我的代码:

    - (void)viewDidLoad
 {
     [super viewDidLoad];
     // Do any additional setup after loading the view, typically from a nib.
     manager = [[CLLocationManager alloc] init];
     manager.distanceFilter = kCLDistanceFilterNone;
     manager.desiredAccuracy = kCLLocationAccuracyBest;
     [manager startUpdatingLocation];
     CLLocation *curLocation = [manager location];
     NSString *theLocation = curLocation.description;
     NSLog(@"%@", theLocation);

     //open the connection
     [self initNetworkConnection];
     NSData *data = [[NSData alloc] initWithData:[theLocation dataUsingEncoding:NSASCIIStringEncoding]];
      NSLog(@"%@", data);
     [outputStream write:[data bytes] maxLength:[data length]];

     //recieve data from the server
     locations = [[NSMutableArray alloc] init];
     NSLog(@"%@", locations);

     [inputStream close];
     [outputStream close];

 }

 -(void)initNetworkConnection {
     CFReadStreamRef readStream;
     CFWriteStreamRef writeStream;
     CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"137.165.8.168", 13413, &readStream, &writeStream);
NSLog(@"connection created!");
inputStream = (__bridge NSInputStream *)readStream;
outputStream = (__bridge NSOutputStream *)writeStream;

//set delegates
[inputStream setDelegate:self];
[outputStream setDelegate:self];

//have processes perform in a run loop
[outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];
[inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode];

//now open the streams
[inputStream open];
[outputStream open];

 }

 - (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode {
     NSLog(@"got an event");
     switch (eventCode) {
         case NSStreamEventHasSpaceAvailable:
             NSLog(@"None!");
             break;
         case NSStreamEventOpenCompleted:
             NSLog(@"Stream opened");
             break;
         case NSStreamEventHasBytesAvailable:
             if (aStream == inputStream) {
                 uint8_t buffer[1024];
                 int len;
                 while ([inputStream hasBytesAvailable]) {
                     len = [inputStream read:buffer maxLength:sizeof(buffer)];
                     if (len > 0) {
                         NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding];
                         if (nil != output) {
                             NSLog(@"%@",output);
                             [locations addObject:output];
                         }
                     }
                 }
             }

     }
 }

 - (void)didReceiveMemoryWarning
 {
     [super didReceiveMemoryWarning];
     // Dispose of any resources that can be recreated.
 }


 @end

【问题讨论】:

  • 可能不是你的问题,但你应该在不同的线程上这样做。

标签: ios objective-c nsinputstream


【解决方案1】:

您应该在调用-initNetworkConnection 之前实例化locations (然后打开您的流)。否则,当您收到第一个 NSStreamEventHasBytesAvailable 通知时,locations 很可能是 nil

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-07-29
    • 2012-03-29
    • 2013-05-19
    • 2023-03-13
    • 1970-01-01
    • 1970-01-01
    • 2012-02-21
    • 2021-11-08
    相关资源
    最近更新 更多