2009-04-01 11 views
6

मैं एक सॉकेट के माध्यम से सर्वर पर UIImage भेजना चाहता हूं।NSOutputStream के लेखन संदेश का उपयोग कैसे करें?


- (IBAction)send:(id)sender { 
    NSURL *website = [NSURL URLWithString:str_IP]; 
    NSHost *host = [NSHost hostWithName:[website host]]; 
    [NSStream getStreamsToHost:host port:1100 inputStream:nil outputStream:&oStream]; 
    [oStream retain]; 
    [oStream setDelegate:self]; 
    [oStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; 
    [oStream open]; 
} 

ख) मैं लिखने के पूरा होने के बाद खुला NSData outputstream और त्रुटि को संभाल अगर त्रुटि तब होती है करने के लिए:

क) मैं outputstream खोलें।


- (void) stream: (NSStream *) stream handleEvent: (NSStreamEvent) eventCode 
{ 
    //printf("EVENT: Start.\n"); 

    switch(eventCode) 
    { 
      case NSStreamEventOpenCompleted: 
      { 
       //printf("EVENT: Open completed.\n"); 

       if(stream == oStream) 
        { 
         //printf("Sending...\n"); 
         NSData *data = UIImageJPEGRepresentation(drawImage.image, 90); 
         NSInteger x = [oStream write:[data bytes] maxLength:[data length]]; 
        } 

       break; 
      } 
      case NSStreamEventEndEncountered: 
      { 
       //printf("EVENT: End encountered.\n"); 
       break; 
      } 
      case NSStreamEventHasSpaceAvailable: 
      { 
       //printf("EVENT: Has space available.\n"); 
       break; 
      } 
      case NSStreamEventHasBytesAvailable: 
      { 
       //printf("EVENT: Has bytes available.\n"); 
       break; 
      } 
      case NSStreamEventErrorOccurred: 
      { 
       UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error Occurred"  
                   message:nil 
                   delegate:nil    
                 cancelButtonTitle:@"OK"    
                 otherButtonTitles:nil];     
       [alert show]; 
       [alert release]; 
       break; 
      } 
      case NSStreamEventNone: 
      { 
       //printf("EVENT: None.\n"); 
       break; 
      } 
    } 

    //printf("EVENT: End.\n"); 
} 

मुझे इस कोड चलाने के लिए, NSStreamEventOpenCompleted और NSStreamEventErrorOccurred called.The NSOutputStream के लिखने विधि सफलतापूर्वक बुलाया गया था और सभी डेटा नहीं के बराबर नहीं है। लेकिन ओस्ट्रीम को डेटा लिखा जाने के बाद, इवेंट कोड NSStreamEventErrorOccurred में बदल जाएगा।

तो मुझे लगता है कि शायद [ओस्ट्रीम लेखन] का उपयोग करने का यह सही तरीका नहीं है। तब इस संदेश का उपयोग करने का सही तरीका क्या है? मुझे लगता है कि यह संदेश -1073748088 का एनएसआईएनटेगर देता है, समस्या क्या हो सकती है?

+0

क्या [oStream streamError] क्या आप देता है? – Chuck

+0

ऑपरेशन पूरा नहीं हो सका। ऑपरेशन समय –

उत्तर

13

आउटपुट स्ट्रीम में स्थान उपलब्ध होने के बाद ही आपको डेटा लिखना चाहिए। जब धारा खोलने खत्म हो जाती है, तो यह हमेशा अंतरिक्ष उपलब्ध नहीं होती है, इसलिए इसे लिखना काम नहीं करेगा। यदि आप write को NSStreamEventHasSpaceAvailable हैंडलर पर कॉल करते हैं, तो इसे सफल होना चाहिए।

इसके अलावा, सॉकेट के दूसरे छोर पर कंप्यूटर को आपके द्वारा भेजे जा रहे डेटा की लंबाई जानने का कोई तरीका नहीं है। जब तक आप सॉकेट बंद करके अंत के डेटा संकेत कर रहे हैं, आप स्पष्ट रूप से डेटा के साथ डेटा लंबाई भेजना चाहिए:

case NSStreamEventHasSpaceAvailable: 
{ 
    if(stream == oStream) 
    { 
     NSData *data = UIImageJPEGRepresentation(drawImage.image, 90); 
     // Convert from host to network endianness 
     uint32_t length = (uint32_t)htonl([data length]); 
     // Don't forget to check the return value of 'write' 
     [oStream write:(uint8_t *)&length maxLength:4]; 
     [oStream write:[data bytes] maxLength:length]; 
    } 
    break; 
} 
+1

एक चेतावनी यह कहती है कि: [ओस्ट्रीम लिखना: और लंबाई] में, लंबाई असंगत सूचक प्रकार है। –

+0

मैंने कोड अपडेट किया है - चेतावनी से छुटकारा पाने के लिए बस एक uint8_t * पर डाला गया है। (यह तकनीकी रूप से सी 99 सख्त एलियासिंग नियमों का उल्लंघन करता है, लेकिन व्यवहार में इससे कोई फर्क नहीं पड़ता।) –

+0

ओस्ट्रीम अब सर्वर पर लंबाई और डेटा भेजता रहता है। सर्वर अभी भी डेटा के अंत को नहीं जानता है। मैं [ओस्ट्रीम क्लोज़] कहां जोड़ सकता हूं ;? या मुझे इसे बंद करने के लिए सर्वर पक्ष में कोड जोड़ना चाहिए? –

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