2016-09-20 36 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表示我的缓冲区已收到整个字符串。 现在开始发送一个文件,所以它的工作...

要发送字符串套接字,您必须标记字符串的结尾。即;添加\n

0

为了纪念与开始和结束字符串串有ASCII control characters这么做中,八位字节分别为\002 & \003。我会建议使用这些控制字符,而不是仅添加换行符,您的文本可能有换行符,这可能会产生问题。