2012-10-10 7 views
8

का उपयोग करके सॉकेट के माध्यम से एनएसएसटींग को कैसे भेजना है मुझे सॉकेट प्रोग्रामिंग का उपयोग करके आईओएस के लिए चैट एप बनाना है और मेरा आईपी पता 192.168.0.57:9300 है। मैंने Raywenderlich सॉकेट प्रोग्रामिंग उदाहरण का उपयोग किया है, डेटा को ठीक से काम कर रहा है लेकिन काम नहीं कर रहा है, कोई त्रुटि या क्रैश नहीं है। मेरा कोड निम्नानुसार है। उद्घाटन के लिएNSOutputStream

कोड डेटा भेजने

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

प्रतिनिधियों

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

    } 

प्रदान करें सुझाव के लिए धाराओं

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

कोड।

+0

"यह प्रेषण स्ट्रिंग दिखाता है" के साथ आपका क्या मतलब है? क्या रिसीवर इसे इस तरह दिखाता है? रिसीवर क्या है (क्या सॉफ्टवेयर, पोस्ट स्रोत स्निपेट यदि संभव हो)? आप प्राप्त स्ट्रिंग को कैसे संसाधित करते हैं? – nullp01nter

+0

मैंने सभी कोड संलग्न किए हैं। सर्वर कोड php – Suraj

+0

में लिखा गया है, मैंने कनेक्शन शुरू करने और आईफोन से अपने मैक में नेटवर्क यातायात भेजने के लिए अपना सटीक कोड उपयोग किया था। प्राप्त करने वाला सॉफ़्टवेयर उद्देश्य सी में लिखा गया है और NSStreams का उपयोग भी कर रहा है। सभी प्रेषित तार ठीक थे। मुझे लगता है कि आपकी समस्या सर्वर पक्ष (PHP) पर हो सकती है। क्या आप सत्यापित करने में सक्षम हैं (स्ट्रिंग भेजने के लिए किसी अन्य सॉफ़्टवेयर के साथ) कि आपका सर्वर हिस्सा काम कर रहा है? – nullp01nter

उत्तर

5

आप "\ n" इस तरह आप अपनी प्रतिक्रिया के अंत में जोड़ना चाहिए:

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

मेरे लिए यह काम करते हैं, लेकिन मेरी समस्या यह है कि मैं समारोह (void)stream:(NSStream *)theStream handleEvent:(NSStreamEvent)streamEvent

+0

जोड़ना \ n इसे मेरे लिए ठीक नहीं करता है। यह समस्या वास्तव में मुझे परेशान कर रही है क्योंकि टर्मिनल में कमांड भेजना इतना आसान है! मेरे कमांड में उद्धरण है कि मैं \ "के साथ चिह्नित करता हूं, तो शायद यह एक समस्या है? – sudo

1

का उपयोग कर डेटा प्राप्त नहीं कर सकता है मुझे भी इसी तरह की समस्या थी। इसे स्ट्रिंग में नई लाइन और लाइन-फीड वर्ण जोड़कर हल किया गया।

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

मुझे एक अलग थ्रेड लिखने के लिए मेरे लिए इस मुद्दे को हल किया गया।
समझ में आता है क्योंकि किसी को वास्तव में मुख्य धागे पर नेटवर्क ऑप्स नहीं करना चाहिए।

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

नोट करने के लिए एक और मुद्दा यह है कि NSStreamEventOpenCompleted घटना दो बार कहा जाता है:
यहाँ मेरी कोड है। एक बार जब इनपुट और आउटपुट धाराओं में से प्रत्येक खोला जाता है। इसलिए किसी को सावधानी बरतनी चाहिए कि उसकी घटना से पहले आउटपुट स्ट्रीम को न लिखें।

संबंधित मुद्दे