2012-10-10 14 views
8

Soket programlama kullanarak iOS için bir sohbet uygulaması oluşturmalı ve IP adresim 192.168.0.57:9300. Raywenderlich soket programlama örneğini kullandım, veriyi düzgün şekilde alıyor ancak çalışmıyor mesajı gönderirken herhangi bir hata ya da kilitlenme yok. Kodum aşağıdaki gibidir. açılması içinNSOutputStream kullanarak soketten NSString'e nasıl yollanır

kod göndererek veri

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

Delegeler

- (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]; 

    } 

bana veriniz öneri için

- (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];  
} 

kodu akışları.

+0

"Gönderme dizesini gösterir" ile ne demek istiyorsun? Alıcı böyle mi gösteriyor? Alıcı nedir (Mümkünse Yazılım, kaynak kod pasajı nedir)? Alınan dizeyi nasıl işlersiniz? – nullp01nter

+0

Tüm kod ekledim.rever kodları php – Suraj

+0

ile yazılmıştır Bir bağlantıyı başlatmak ve bir iPhone'dan Mac'e ağ trafiği göndermek için tam kodunuzu kullandım. Alıcı yazılım, Objective C'de ve ayrıca NSStreams kullanılarak yazılmıştır. Tüm iletilen dizeler Tamam. Problemin sunucu tarafında (PHP) olabileceğini düşünüyorum. Sunucu bölümünüzün çalıştığını (dizeleri göndermek için başka bir yazılımla) doğrulayabildiniz mi? – nullp01nter

cevap

5

Böyle Yanıtınız sonundaki "\ n" eklemek gerekir:

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

benim için bu iş, ama benim sorunum ben işlevini (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent

+0

Ekleniyor \ n benim için düzeltmiyor. Bu problem gerçekten beni rahatsız ediyor çünkü Terminalde komutları göndermek çok kolay! Komutumda \ "ile işaretlediğim alıntılar var, belki bu bir problem mi? – sudo

1

kullanarak veri alamıyor olmasıdır Benzer bir problemim vardı. Dizede yeni satır ve satır besleme karakterini ekleyerek çözdünüz.

- (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

Bu sorunu benim için çözdüğüm ayrı bir konu yazmayı buldum.
Ana iş parçacığı üzerinde ağ opları yapmamalı gibi mantıklı.

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); 
}); 

Unutulmaması gereken bir diğer nokta NSStreamEventOpenCompleted olay iki kez denir olmasıdır:
İşte benim kodudur. Giriş ve çıkış akımlarının her biri açıldığında. Dolayısıyla, olaydan önce çıktı akışına yazmamaya dikkat etmeliyiz.

İlgili konular