1

尝试编写基本 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
4

1 回答 1

0

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

于 2014-01-21T16:34:41.060 回答