2009-04-29 73 views
4

我想使用NSStream对象打开然后写入和读取一个套接字,但我有一个问题。NSOuputStream多次写入

我不知道在打开它之后如何在套接字上编写代码。

下面是如何我已经做

1)第一开扩套接字:

NSURL *website = [NSURL URLWithString:urlStr]; 
     if (!website) { 
      NSLog(@"%@ is not a valid URL"); 
      return; 
     } 
     NSHost *host = [NSHost hostWithName:urlStr]; 
     // iStream and oStream are instance variables 
     [NSStream getStreamsToHost:host port:6667 inputStream:&iStream 
         outputStream:&oStream]; 
     [iStream retain]; 
     [oStream retain]; 
     [iStream setDelegate:self]; 
     [oStream setDelegate:self]; 
     [iStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
          forMode:NSDefaultRunLoopMode]; 
     [oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
          forMode:NSDefaultRunLoopMode]; 
     [iStream open]; 
     [oStream open]; 

2)设置循环:

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

    if (theStream == iStream) io = @">>"; 
    else io = @"<<"; 
    NSLog(@"stream : %@",theStream); 

    NSString *event; 
    switch (streamEvent) 
    { 
     case NSStreamEventNone: 
      event = @"NSStreamEventNone"; 
      break; 
     case NSStreamEventOpenCompleted: 
      event = @"NSStreamEventOpenCompleted"; 
      break; 
     case NSStreamEventHasBytesAvailable:{ 
      event = @"NSStreamEventHasBytesAvailables"; 
      if (theStream == iStream) 
      { 
       if(!_data) { 
        _data = [[NSMutableData data] retain]; 
       } 
       uint8_t buf[1024]; 
       unsigned int len = 0; 
       len = [iStream read:buf maxLength:1024]; 
       NSLog(@"Lenght data read : %d", len); 
       if(len) { 
        NSData * dataReceived= [[NSString stringWithFormat:@"%s\n", (char *)buf] dataUsingEncoding:NSUTF8StringEncoding]; 
        NSString *s = [[NSString alloc] initWithData:dataReceived encoding:NSUTF8StringEncoding]; 
        NSLog(@"Received _data: \"%@\"\n",s); 



       } else { 
        NSLog(@"nothing to read!"); 
       } 
      }else { 
       NSLog(@"Not the good stream"); 
      } 

      break; 
     } 

     case NSStreamEventHasSpaceAvailable:{ 
      event = @"NSStreamEventHasSpaceAvailable"; 
      if (theStream == oStream) 
      { 
       if(isConnexionCommandSent == NO){ 
        [self sendCommand:@"My connection command"];  
        isConnexionCommandSent = YES; 
       } 

      } 

      break; 
     } 

     case NSStreamEventErrorOccurred: 
      event = @"NSStreamEventErrorOccurred"; 
      NSError *theError = [theStream streamError]; 
      UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error" message:[theError localizedDescription] 
                  delegate:nil cancelButtonTitle:@"OK" otherButtonTitles: nil]; 
      [alert show]; 
      [alert release]; 
      break; 
     case NSStreamEventEndEncountered: 
      event = @"NSStreamEventEndEncountered"; 

      break; 
     default: 
      event = @"** Unknown"; 
    } 

    NSLog(@"%@ : %@", io, event); 
} 

3)然后我有一个功能,是当我触摸按钮时调用

- (IBAction)join:(id)sender{ 
    if([oStream hasSpaceAvailable]){ 
     NSLog(@"iStream Status : %d",[iStream streamStatus]); 
     NSLog(@"oStream Status : %d",[oStream streamStatus]); 
     [self sendCommand:@"join"]; 

    }else{ 
     NSLog(@"Error command can't be sent");  
    } 
} 

-(void) sendCommand:(NSString *) command{ 
    NSLog(@"space : %d",[oStream hasSpaceAvailable]); 
    if ([oStream hasSpaceAvailable]) 
    { 
     NSLog(@"Command writen : %s\n",[command cStringUsingEncoding:NSASCIIStringEncoding]); 
     NSInteger i=[oStream write:(const uint8_t *)[command cStringUsingEncoding:NSASCIIStringEncoding] maxLength:(NSInteger)[command lengthOfBytesUsingEncoding:NSASCIIStringEncoding]]; 
     if (i<0) 
     { 
      NSLog(@"erreur lors de l'envoi, status:%i, erreur:%@", [oStream streamStatus], [oStream streamError]); 
     } 
     isReadyToSend = NO; 
    } 

    else 
    { 
     NSLog(@"impossible d'envoyer, status:%i, erreur:%@", [oStream streamStatus], [oStream streamError]); 
    } 
} 

但问题是,当函数加入被调用时,一切顺利,但服务器收到什么...

NSInteger i=[oStream write:(const uint8_t *)[command cStringUsingEncoding:NSASCIIStringEncoding] maxLength:(NSInteger)[command lengthOfBytesUsingEncoding:NSASCIIStringEncoding]]; 

我是> 0,所以我认为写作去好吧,但在服务器上没有收到任何东西...我不知道为什么...

你能帮我吗?

+0

是否'[self sendCommand:@“My connection command”];'成功? 如果“写入”成功,则意味着客户端tcp堆栈正在尝试传递这些字节。但是如果tcp连接已经死亡,它将不会被传送。你确定数据没有收到,你是如何验证这一点的? – 2010-02-03 11:51:40

回答

0

嘿@Ptitaw见this post。我相信你可能会找到你的答案和更容易的方式来连接并自动获取所有事件(阅读,写作等)。 希望我可以帮助:)

0

答非常非常迟的答案,但是,它可能对有类似问题的人有所帮助。

我认为这可能是由于数据编码机制。您的服务器可能使用UTF-8编码,并使用NSASCIIStringEncoding发送数据。试试这个:

NSInteger i=[oStream write:(const uint8_t *)[command cStringUsingEncoding:NSUTF8StringEncoding] maxLength:(NSInteger)[command lengthOfBytesUsingEncoding:NSUTF8StringEncoding]];