2016-09-20 9 views
5

Mam zaimplementowane połączenie z gniazdem w systemie iOS.iOS wysyła dane za pomocą połączenia z gniazdem

Co chcę zrobić, to wysłać ciąg danych do podłączonego urządzenia ... (Mogę odbierać dane, gdy ktoś wysyła do mojego urządzenia) Próbowałem tego kodu, ale dane są odbierane w innych urządzenie, kiedy zamykam aplikację.

- (IBAction)connectToServer:(id)sender { 

    NSLog(@"Setting up connection to %@ : %i", _ipAddressText.text, [_portText.text intValue]); 
    CFStreamCreatePairWithSocketToHost(kCFAllocatorDefault, (__bridge CFStringRef) _ipAddressText.text, [_portText.text intValue], &readStream, &writeStream); 

    messages = [[NSMutableArray alloc] init]; 

    [self open]; 
} 

- (void)open { 

    NSLog(@"Opening streams."); 

    outputStream = (__bridge NSOutputStream *)writeStream; 
    inputStream = (__bridge NSInputStream *)readStream; 

    [outputStream setDelegate:self]; 
    [inputStream setDelegate:self]; 

    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

    [outputStream open]; 
    [inputStream open]; 

    _connectedLabel.text = @"Connected"; 
} 

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent { 

    NSLog(@"stream event %lu", streamEvent); 

    switch (streamEvent) { 

     case NSStreamEventOpenCompleted: 
      NSLog(@"Stream opened"); 
      _connectedLabel.text = @"Connected"; 
      break; 

     case NSStreamEventHasBytesAvailable: 
      if (theStream == inputStream) 
      { 
       uint8_t buffer[1024]; 
       NSInteger 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(@"server said: %@", output); 
          [self messageReceived:output]; 
         } 
        } 
       } 
      } 
      break; 

     case NSStreamEventHasSpaceAvailable: 
      NSLog(@"Stream has space available now"); 
      break; 

     case NSStreamEventErrorOccurred: 
      NSLog(@"error: %@",[theStream streamError].localizedDescription); 
      break; 

     case NSStreamEventEndEncountered: 
      [theStream close]; 
      [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
      _connectedLabel.text = @"Disconnected"; 
      NSLog(@"close stream"); 
      break; 

     default: 
      NSLog(@"Unknown event"); 
    } 
} 

/* Sends data to other device */ 
- (IBAction) sendMessage { 

    NSLog(@"sendMessage"); 
    NSString *response = [NSString stringWithFormat:@"msg:%@", _dataToSendText.text]; 
    NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]]; 
    NSLog(@"[data length] %lu",(unsigned long)[data length]); 
    [outputStream write:[data bytes] maxLength:[data length]]; 

} 

Gdzie popełniam błąd?

Odpowiedz

3

Po wykonaniu trudnych badań stwierdziłem, że dodanie \n na końcu komunikatu ciąg wskazuje, że mój bufor otrzymał cały ciąg znaków. teraz rozpocząć wysyłanie pliku, więc zadziałało ...

Aby wysłać ciąg znaków przez gniazda, należy oznaczyć koniec ciągu. to znaczy; Dodaj \n

0

Aby oznaczyć ciąg znaków z początku i końca ciągu istnieją ASCII control characters zrobić tak, że oktety są \002 & \003 odpowiednio. Polecam używanie tych znaków kontrolnych zamiast po prostu dodawać podział wierszy, tekst może zawierać podział wierszy, co może powodować problemy.

Powiązane problemy