2016-09-20 4 views
5

Ich habe Socket-Verbindung in iOS implementiert.iOS senden Daten über Socket-Verbindung

Was ich tun möchte, ist Zeichenfolge von Daten an das angeschlossene Gerät senden ... (I bin in der Lage, Daten zu empfangen, wenn jemand auf mein Gerät sendet) Ich habe diesen Code versucht, aber Daten werden auf andere immer erhalten Gerät, wenn ich meine App schließe.

- (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]]; 

} 

Wo mache ich Fehler?

Antwort

3

Nach der harten Forschung fand ich \n am Ende der Zeichenfolge Nachricht gibt an, dass mein Puffer die ganze Zeichenfolge erhalten hat. jetzt beginnen, eine Datei zu senden, so hat es funktioniert ...

Um eine Zeichenfolge über Sockets senden, müssen Sie das Ende der Zeichenfolge markieren. dh; Fügen Sie einen \n

0

Um einen String mit Anfang und Ende der Zeichenfolge zu markieren dort ASCII control characters sind, dies zu tun, sind die Oktetts \002 & \003 sind. Ich würde empfehlen, diese Steuerzeichen zu verwenden, anstatt nur einen Zeilenumbruch hinzuzufügen, Ihr Text könnte Zeilenumbrüche haben und das könnte Probleme verursachen.