如何为NSOutputStream添加数据?

时间:2009-03-29 13:02:15

标签: objective-c cocoa sockets stream

我想将UIImage转换为NSOutputStream并通过套接字将其发送到服务器。


#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


我的问题是我在哪里可以添加“sendStream = ...”等代码?

另一个问题是我可以使用以下方法将UIImage转换为NSData:

NSData *imageData = UIImageJPEGRepresentation(imageView.image, 90);

但是如何将imageData转换为NSOutputStream的实例?

1 个答案:

答案 0 :(得分:2)

  

我的问题是我在哪里可以添加“sendStream = ...”等代码?

您已经为sendStream分配了getStreamsToHost:port:inputStream:outputStream:消息。该方法通过引用返回两个流。

  

...如何将imageData转换为NSOutputStream的实例?

您不需要将数据转换为流,您需要告诉流写入数据。

试试NSOutputStream's write:maxLength: method。您需要从数据对象传递字节和长度。