2013-04-22 69 views
2

我是套接字編程的新手,我參考了http://www.raywenderlich.com/3932/how-to-create-a-socket-based-iphone-app-and-server,我使用的是PHP服務器,我面對的問題是,我可以使用發送/接收消息插座,但我收到的消息是像我收到的消息打破應該是「你好abcd」,但它給了我「」然後一段時間後「llo」然後一段時間後「abcd」。 我正在使用以下代碼來接收消息:使用套接字接收破/不完整的消息

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


    switch (streamEvent) { 

     case NSStreamEventNone: 
     NSLog(@"Stream event none"); 
      break; 

     case NSStreamEventOpenCompleted: 
      NSLog(@"Stream opened"); 
      break; 
     case NSStreamEventHasBytesAvailable: 


     if (theStream == inputStream) { 

       int len=0; 
       uint8_t *buffer = (uint8_t *)calloc(1, (16*1024)); 

       while ([inputStream hasBytesAvailable]) { 
        len = [inputStream read:buffer maxLength:sizeof(buffer)]; 


        NSLog(@"byte available %d",len); 

        if (len > 0) { 
         NSMutableData* data=[[NSMutableData alloc] initWithLength:0]; 
         // 
         [data appendBytes:(const void *)buffer length:len]; 


//      NSString *s = [[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; 
//          NSLog(@"rs %@",s); 

         NSString *output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding]; 


         if (nil != output) { 
          NSLog(@"server said: %@", output); 
          [self messageReceived:output]; 

         } 
        } 
       } 

      } 



      break; 

     case NSStreamEventHasSpaceAvailable: 
      NSLog(@"event space available"); 

      break; 

     case NSStreamEventErrorOccurred: 

      NSLog(@"Can not connect to the host!"); 
      break; 

     case NSStreamEventEndEncountered: 
      NSLog(@"end"); 
      [theStream close]; 
      [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
      [theStream release]; 
      theStream = nil; 

      break; 


     default: 
      NSLog(@"Unknown event"); 
    } 

} 
+0

我可能是錯的,但不應該sizeof(緩衝區)返回指針的大小而不是緩衝區的大小?我的意思是,分配是動態的...另一點,當你分配你的NSMutableData時,爲什麼當你知道最終長度(len)時,它的長度爲0? – 2013-04-22 07:02:13

+0

plz檢查這一個http://stackoverflow.com/questions/15583366/tcp-socket-programming-in-ios-server-client-response – 2013-04-22 07:14:41

+0

那麼你建議我做什麼? @JeromeDiaz – 2013-04-22 07:14:56

回答

0

我正面臨同樣的問題。我所做的並不是在委託方法中追加字符串,而是將字符串傳遞給另一個方法,在輸入流中檢查字節並在其後附加字符串。這是我的應用程序的片段。希望能幫助到你。

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent { 
switch (streamEvent) { 

    case NSStreamEventOpenCompleted: 
     NSLog(@"Stream opened"); 
     break; 

    case NSStreamEventHasBytesAvailable: 
     if (theStream == inputStream) { 
      uint8_t buffer[1024]; 
      NSInteger len = [inputStream read:buffer maxLength:sizeof(buffer)]; 
      NSString *output; 
      if (len > 0) { 
       output = [[NSString alloc] initWithBytes:buffer length:len encoding:NSASCIIStringEncoding]; 
       [self messageReceived:output]; 
      } 
     } 

     break; 

    case NSStreamEventErrorOccurred: 
    { 
     NSLog(@"Can not connect to the host!"); 
     [theStream close]; 
     [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 

     UIAlertView *errorOccured = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Some error occured." delegate:self cancelButtonTitle:@"Ok" otherButtonTitles:nil]; 
     [errorOccured show]; 
    } 
     break; 

    case NSStreamEventEndEncountered: 
     NSLog(@"Stream end occured"); 
     break; 

    default: 
     NSLog(@"Unknown event"); 
    } 

} 
- (void) messageReceived:(NSString *)message { 
    if (inputStream.hasBytesAvailable) { 
     [streamResponseStr appendString:message]; 
    }else{ 
     [streamResponseStr appendString:message]; 
     [self parseServerResponse:streamResponseStr]; 

     streamResponseStr = nil; 
     streamResponseStr = [[NSMutableString alloc] init]; 
    } 
} 
+0

Thnx但它給我同樣的結果。 :( – 2013-04-22 09:24:37