2013-03-19 38 views
0

这是问题。当我的应用程序启动时,我在端口5000连接到server1。我发送数据到server1。 Server1发回数据。 Server1关闭连接。 inputStream发生NSStreamEventEndEncountered事件。然后我在端口5001连接到server2。我尝试将数据发送到server2,但数据最终到达server1。不知怎的,inputStream在端口5001连接,我的outputStream在5000连接。我做错了什么?NSOutputStream不能关闭?

- (void) initNetworkCommunication: (uint32_t)port { 
    CFReadStreamRef readStream; 
    CFWriteStreamRef writeStream; 
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"localhost", port, &readStream, &writeStream); 
    inputStream = (NSInputStream *)readStream; 
    outputStream = (NSOutputStream *)writeStream; 
    [inputStream setDelegate:self]; 
    [outputStream setDelegate:self]; 
    [inputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [outputStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [inputStream open]; 
    [outputStream open]; 
} 

- (void) onClientConnectionLost { 
    if (atServer1 == YES) { 
     atServer1 = NO; 
     [self initNetworkCommunication: 5001]; 
    } 
    if (atServer1 == NO) { 
     atServer1 = YES; 
     [self initNetworkCommunication: 5000]; 
    } 
} 

- (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent { 
    switch (streamEvent) { 
     case NSStreamEventOpenCompleted: 
      NSLog(@"Stream opened"); 
      break; 
     case NSStreamEventHasBytesAvailable:    
      if (theStream == inputStream) { 
       //handle packets...    
      } 
      break; 
     case NSStreamEventErrorOccurred: 
      NSLog(@"Can not connect to the host!"); 
      break; 
     case NSStreamEventEndEncountered: 
      if (theStream == inputStream) { 
       [theStream close]; 
       [theStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
       [theStream release]; 
       theStream = nil; 

       [outputStream close]; 
       [outputStream removeFromRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
       [outputStream release]; 
       outputStream = nil; 

       [self onClientConnectionLost];    
      } 
      break; 
     default: 
      NSLog(@"Unknown event"); 
    } 
} 

回答

2
- (void) onClientConnectionLost { 
if (atServer1 == YES) { 
    atServer1 = NO; 
    [self initNetworkCommunication: 5001]; 
} 
else if (atServer1 == NO) { 
    atServer1 = YES; 
    [self initNetworkCommunication: 5000]; 
} 

}

在旧的代码...当atServer1 = YES,将执行第一个if语句....这台atServer1为NO ...所以第二if语句是真的..所以它也会执行..