2012-10-10 14 views
8

Muszę utworzyć aplikację do czatu dla systemu iOS przy użyciu programowania gniazd, a mój adres IP to 192.168.0.57:9300. Użyłem przykładu programowania gniazda, odbierając dane działające poprawnie, ale wysyłanie nie działa, nie ma żadnych błędów ani awarii. Mój kod jest następujący.Jak wysłać NSString przez gniazdo przy użyciu NSOutputStream

kod

do otwierania strumieni kod

- (void) initNetworkCommunication { 

    CFReadStreamRef readStream; 
    CFWriteStreamRef writeStream; 
    CFStreamCreatePairWithSocketToHost(NULL, (CFStringRef)@"192.168.0.57", 9300, &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];  
} 

do wysyłania danych

- (IBAction)sendMessage:(id)sender 
{ 
     NSString *response = @"lets start chat"; 
     NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]]; 
     [outputStream write:[data bytes] maxLength:[data length]]; 
} 

Delegaci

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

    NSLog(@"stream event %i", streamEvent); 

    switch (streamEvent) { 

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

      if (theStream == inputStream) { 

       uint8_t buffer[1024]; 
       int len; 

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

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

         if (nil != output) { 

          NSLog(@"\nreciving data------%@,buffer); 

          [self messageReceived:output]; 

         } 
        } 
       } 
      } 
      break; 


     case NSStreamEventErrorOccurred: 

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

     case NSStreamEventEndEncountered: 

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

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

} 
Message sending 
    - (void) messageReceived:(NSString *)message { 

     [self.messages addObject:message]; 
     [self.tView reloadData]; 
     NSIndexPath *topIndexPath = [NSIndexPath indexPathForRow:messages.count-1 
                 inSection:0]; 
     [self.tView scrollToRowAtIndexPath:topIndexPath 
          atScrollPosition:UITableViewScrollPositionMiddle 
            animated:YES]; 

    } 

proszę podać mi sugestia.

+0

Co masz na myśli, mówiąc "pokazuje ciąg wysyłania"? Czy odbiorca tak to pokazuje? Co to jest odbiornik (jakie oprogramowanie, fragment kodu źródłowego, jeśli to możliwe)? Jak przetwarzasz otrzymany ciąg? – nullp01nter

+0

Mam dołączony cały kod code.server są napisane w php – Suraj

+0

Użyłem twojego dokładnego kodu, aby zainicjować połączenie i wysłać ruch sieciowy z iPhone'a do mojego Macintosha. Oprogramowanie odbierające jest napisane w Objective C, a także przy użyciu NSStreams. Wszystkie wysłane ciągi były w porządku. Domyślam się, że twój problem może być po stronie serwera (PHP). Czy byłeś w stanie zweryfikować (za pomocą innego oprogramowania do wysyłania łańcuchów), że twoja część serwera działa? – nullp01nter

Odpowiedz

5

Należy dodać „\ n” na końcu swojej odpowiedzi jak ten:

- (IBAction)sendMessage:(id)sender 
{ 
     NSString *response = @"lets start chat\n"; 
     ////your code 
} 

To praca dla mnie, ale moim problemem jest to, że nie może odbierać dane przy użyciu funkcji (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent

+0

Dodanie \ n nie naprawi tego dla mnie. Ten problem naprawdę mnie dręczy, ponieważ wysyłanie poleceń w Terminalu jest tak proste! Moje polecenie zawiera cytaty, które zaznaczam \ ", więc może to jest problem? – sudo

1

Miałem podobny problem. Zostało to rozwiązane przez dodanie znaku nowej linii i linii do łańcucha.

- (IBAction)sendMessage:(id)sender { 

     NSString *response = @"lets start chat\r\n\r\n"; 
     NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]]; 
     [outputStream write:[data bytes] maxLength:[data length]]; 
} 
1

Napisałam, że napisanie osobnego wątku rozwiązało dla mnie ten problem.
Ma to sens, ponieważ nie powinno się robić operacji sieciowych w głównym wątku.
Oto mój kod:

dispatch_async(dispatch_get_global_queue(QOS_CLASS_BACKGROUND, 0), ^(void) { 
    NSData *data = [[NSData alloc] initWithData:[response dataUsingEncoding:NSASCIIStringEncoding]]; 
    NSInteger len = [outputStream write:[data bytes] maxLength:[data length]]; 
    NSLog(@"Len = %ld", len); 
}); 

Inną kwestią zasługującą na uwagę jest to, że zdarzenie NSStreamEventOpenCompleted nazywa się dwukrotnie. Raz, gdy każdy ze strumieni wejściowych i wyjściowych zostanie otwarty. Tak więc należy uważać, aby nie pisać do strumienia wyjściowego przed jego zdarzeniem.

Powiązane problemy