2016-09-20 12 views
5

iOSでソケット接続を実装しました。iOSはソケット接続を使用してデータを送信します

私は何をしたいことは、接続されたデバイスへのデータの文字列を送信することです... (私は誰かが私のデバイスに送信するときにデータを受信することができています)私はこのコードを試してみましたが、データが他に受信なっている 私のアプリを閉じると、

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

} 

私は間違いを犯していますか?

答えて

3

ハードリサーチを行った後、私は文字列の最後に\nを追加すると、バッファが文字列全体を受け取ったことを示しています。 はファイルの送信を開始するので、正常に機能しました。

文字列の終わりをマークする必要があります。すなわち、そうするASCII control charactersがあります開始し、文字列の末尾に文字列をマークするには\n

0

を追加し、オクテットはそれぞれ\002 & \003です。改行を追加するだけでなく、テキストに改行があり、問題が発生する可能性があるので、これらの制御文字を使用することをお勧めします。

関連する問題