2013-01-20 115 views
0

OK。因此,我必須處理NSStreamDelegate實現。NSStreamDelegate讀取異步數據

的方法如下:

1-命令數據被寫入到輸出流來觸發另一端

2-另一端,開始把數據輸入流BUT異步這意味着數據的第一部分在開始時接收,然後幾秒鐘後,其餘數據進入。

3-收到所有數據後,服務器將不會發送任何數據,但連接保持打開。 (輸入流狀態=打開(2))

4-幾分鐘後,服務器結束連接(輸入流狀態= 5),並觸發NSStreamEventEndEncountered。

sendRequest將類

- (void)sendSecondRequest { 
    CFReadStreamRef readStream = nil; 
    CFWriteStreamRef writeStream = nil; 
    CFStreamCreatePairWithSocketToHost(NULL, (__bridge CFStringRef)self.SOMEServer, self.SOMEPort, &readStream, &writeStream); 
    self.inputStream = (__bridge NSInputStream *)readStream; 
    self.outputStream = (__bridge NSOutputStream *)writeStream; 
    [self.inputStream setDelegate:self]; 
    [self.outputStream setDelegate:self]; 
    NSData *data = [NSData dataWithData:[kSecondCall dataUsingEncoding:NSASCIIStringEncoding]]; 
    [self.inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [self.outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [self.inputStream open]; 
    [self.outputStream open]; 
    [self.outputStream write:[data bytes] maxLength:[data length]]; 
} 

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode { 
    switch (eventCode) { 
     case NSStreamEventOpenCompleted: 
      break; 
     case NSStreamEventHasBytesAvailable: 
      if (aStream == self.inputStream) { 
       uint8_t buffer[1024]; 
       NSInteger len = [self.inputStream read:buffer maxLength:sizeof(buffer)]; 
       if (len > 0) { 
        NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding]; 
        [gOutput appendString:output]; 
       } 
      } 
      break; 
     case NSStreamEventEndEncountered: 
      NSLog(@"Can not connect to the host"); 
      [aStream close]; 
      [aStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
      aStream = nil; 
      break; 
     default: 
      break; 
    } 
} 

- (void)disconnectSocket { 
    [self.inputStream close]; 
    [self.inputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [self.outputStream close]; 
    [self.outputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [self.inputStream setDelegate:nil]; 
    [self.outputStream setDelegate:nil]; 
    self.inputStream = nil; 
    self.outputStream = nil; 
} 

gOutput變量是一個全局變量,我用它來讀取和存儲輸入流。

問題是,由於數據的第一部分立即出現,其餘部分異步進入,所以我無法處理沒有更多數據可用的時刻。

換句話說,我怎麼知道服務器是否完成發送數據,我應該開始處理它?

回答

0

服務器在最後發送終止符序列。當客戶端檢測到這個終結器時,它開始處理....