I want to convert a UIImage to an NSOutputStream and send it to a server through socket.
#import 'Connection.h' @implementation Connection -(void) open: (NSString *) h : (int) p { strHost = h; intPort = p; [NSStream getStreamsToHost:objHost port:intPort inputStream:&receiveStream outputStream:&sendStream]; [receiveStream retain]; [sendStream retain]; [receiveStream setDelegate:self]; [sendStream setDelegate:self]; [receiveStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [sendStream scheduleInRunLoop:[NSRunLoop currentRunLoop] forMode:NSDefaultRunLoopMode]; [receiveStream open]; [sendStream open]; printf('Open.\n'); } - (void) stream: (NSStream *) stream handleEvent: (NSStreamEvent) eventCode { printf('EVENT: Start.\n'); switch(eventCode) { case NSStreamEventOpenCompleted: { printf('EVENT: Open completed.\n'); if(stream == receiveStream) { printf('Receiving...\n'); } if(stream == sendStream) { printf('Sending...\n'); NSString * strBuffer = [NSString stringWithFormat:@'GET / HTTP/1.0\r\n\r\n']; const uint8_t * rawstring = (const uint8_t *)[strBuffer UTF8String]; [sendStream write:rawstring maxLength:strlen(rawstring)]; } 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: { printf('EVENT: Error occurred.\n'); break; } case NSStreamEventNone: { printf('EVENT: None.\n'); break; } } printf('EVENT: End.\n'); } -(void) close { [receiveStream close]; [sendStream close]; printf('Closed.\n'); } @end
My question is where can I add code like ‘sendStream = …’?
Another question is that I can convert UIImage to NSData using:
NSData *imageData = UIImageJPEGRepresentation(imageView.image, 90);
But how to convert the imageData to NSOutputStream’s instance?
You’re already assigning
sendStreamwith thegetStreamsToHost:port:inputStream:outputStream:message. That method returns the two streams by reference.You don’t need to convert the data to a stream, you need to tell a stream to write the data.
Try NSOutputStream’s
write:maxLength:method. You’ll need to pass the bytes and length from the data object.