2014-12-23 7 views
0

Java 서버가 있습니다 (iOS 클라이언트에서 요청을 올바르게 읽을 수 있습니다. 그것을 올바르게, 나는 서버에서 첫 번째 메시지 응답마다 시간을 가지고 있지만, 첫 번째 메시지)받은 후 다른 메시지를 받고 아니지만 : 대부분의 시간을 호출하지NSInputStream을 사용하는 iOS 클라이언트의 Java 서버에서 첫 번째 메시지를받은 후에 더 많은 메시지를받지 못했습니다.

Step 1-> client send login message to server 

Step 2-> server validate the user and sends login info to the clients 

Step 3-> Message Packet1 

     Message Packet2 

     Message Packet3 

     Message Packet4 

step-4-> I have checked server log and it says server has send 4 string 
      messages 

Step-5 -> On client side I am receiving only first message i.e. Message 
      Packet1, and there no other packets on NSInputStream showing. or NSStreamEventHasBytesAvailable option in delegate method-> 
- (void)stream:(NSStream *)theStream 
handleEvent:(NSStreamEvent)streamEvent 

이상의하지만 때로는 그것을 통신의

순서를 MessagePacket2 또는 MessagePacket4 데이터를 호출하고 가져옵니다.

제가 4 패킷 대신 4 패킷 대신 서버에서 첫 번째 패킷 만받는 이유를 알아 채지 못하게 도와주세요.

나는 아래의 튜토리얼에서 코드를 사용하고 -> http://www.raywenderlich.com/3932/networking-tutorial-for-ios-how-to-create-a-socket-based-iphone-app-and-server#comments

내 코드는 여기 ->

@interface NetworkManager()<NSStreamDelegate> 

@property (strong, nonatomic)NSInputStream  *objInputStream; 
@property (strong, nonatomic)NSOutputStream  *objOutputStream; 

@end 

- (void)initializeNetworkCommunicationToServer 
{ 
self.networkOpened = NO; 

CFReadStreamRef readStream; 
CFWriteStreamRef writeStream; 

CFStreamCreatePairWithSocketToHost(NULL, 
            (CFStringRef)SERVER_HOSTNAME, 
            SERVER_PORT_ADDR, 
            &readStream, 
            &writeStream); 

self.objInputStream = (__bridge_transfer NSInputStream *)readStream; 
self.objOutputStream = (__bridge_transfer NSOutputStream*)writeStream; 


[self.objInputStream setDelegate:self]; 
[self.objOutputStream setDelegate:self]; 

[self.objInputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
           forMode:NSDefaultRunLoopMode]; 
[self.objOutputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] 
           forMode:NSDefaultRunLoopMode]; 
[self.objInputStream open]; 
[self.objOutputStream open]; 

} 

//------------------------------------------------------ 
pragma NSStreamDelegate delegate method 
//------------------------------------------------------ 

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

switch (streamEvent) 
{ 
    case NSStreamEventNone: 
    { 
     NSLog(@"NSStreamEventNone"); 
     break; 
    } 
    case NSStreamEventOpenCompleted: 
    { 
     NSLog(@"NSStreamEventOpenCompleted"); 

    } 
     break; 
    case NSStreamEventHasBytesAvailable: 
    { 
     NSLog(@"NSStreamEventHasBytesAvailable:"); 

     if (theStream == self.objInputStream) 
     { 
      while ([self.objInputStream hasBytesAvailable]) 
      { 
       uint8_t buffer[1024]; 
       unsigned int len = 0; 

       len = [self.objInputStream 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); 
        } 

       }//end of if(len > 0) 

      }//end of while 
     } //end of if (theStream == self.objInputStream) 

    } 
     break; 
    case NSStreamEventErrorOccurred: 
    { 
     NSLog(@"NSStreamEventErrorOccurred: Can not connect to the host!"); 
    } 
     break; 
    case NSStreamEventEndEncountered: 
    { 

     NSLog(@"NSStreamEventEndEncountered & network connection ended"); 

     [theStream close]; 
     [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] 
          forMode:NSDefaultRunLoopMode]; 

     theStream = nil; 
    } 
     break; 

     // The NSStreamEventHasSpaceAvailable event indicates that you can write (at least one byte!) to the stream without blocking. That does not mean that previously written data is completely delivered to the other endpoint of the connection. 
    case NSStreamEventHasSpaceAvailable: 
    { 
     NSLog(@"NSStreamEventHasSpaceAvailable"); 

     if(NO == self.networkOpened) 
     { 
      self.networkOpened = YES; 

      [self sendMessage:@"login:username,password"]; 

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


//------------------------------------------------------ 
#pragma mark - send packet 
//------------------------------------------------------ 

- (void)sendMessage:(NSString*)lstrMessage 
{ 
NSMutableData *data = [[NSMutableData alloc] initWithData: 
         [lstrMessage dataUsingEncoding:NSASCIIStringEncoding]]; 

unsigned char suffixBytes[] = {1, 1, 0}; 
[data appendBytes:suffixBytes length:3]; 

[self.objOutputStream write:[data bytes] maxLength:[data length]]; 

NSLog(@"message sent->%@",[NSString stringWithUTF8String:[data bytes]]); 

} 

답변

0
난 당신의 코드를 잘못 무엇인지 모른다

하지만 스트림 튜닝 내 경험 CF API를 사용하여 Core Foundation 스트림을 구독하는 또 다른 방법을 무료로 NSInputStream에 브리징하는 대신에 시도해 볼 것을 제안합니다. 내 말은 CFReadStreamSetClientCFReadStreamScheduleWithRunLoop입니다. 예를 들어 POSInputStreamLibrary 테스트의 경우 my helper class에서 어떻게 수행하는지 볼 수 있습니다.