【问题标题】:When to close NSOutputStream?什么时候关闭 NSOutputStream?
【发布时间】:2010-10-17 07:15:39
【问题描述】:

我想通过socket将一个UIImage的数据发送给服务器,所以我:

a) 打开 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];
}

b) 在空间可用时将数据写入 oStream


- (void) stream: (NSStream *) stream handleEvent: (NSStreamEvent) eventCode
{
switch(eventCode)
    {
    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]);

                    [oStream write:(uint8_t *)&length maxLength:4];
                    [oStream write:[data bytes] maxLength:length];
            }
    }
    break;
}

问题是数据不断地一次又一次地写入 oSream。发送完所有数据如何停止?

我在 Image 数据之前发送数据的长度,以便让服务器知道它何时到达末尾。我是否必须更改服务器端的代码才能在套接字结束时关闭它?我在哪里可以添加 [oStream close] 来关闭客户端的 oStream?

【问题讨论】:

    标签: objective-c cocoa sockets stream


    【解决方案1】:

    问题是数据不断地一次又一次地写入 oSream。发送完所有数据如何停止?

    看,这就是用被动语态思考的危险。用主动语态改写问题:

    问题是数据不断地一次又一次地写入 oSream。发送完所有数据如何停止?

    你几乎已经回答了你自己的问题。

    问题的很大一部分是您的HasSpaceAvailable 处理程序。这就是你正在做的事情:

    1. 创建图像的完整 JPEG 表示(每次)
    2. 发送表示的长度(每次)
    3. 发送表示的第一部分(每次)

    这是三个问题,你需要解决所有三个问题。

    1. 创建一次 JPEG 表示。
    2. 只发送一次表示的长度。
    3. 跟踪您已经发送的内容,只发送您尚未发送的第一部分。

    要做到这三个,将长度放入 NSMutableData 并将 JPEG 表示附加到它。然后,保留这个新数据对象,并为字节指针和剩余长度添加额外的实例变量。您将在进入HasSpaceAvailable 状态之前完成所有这些

    然后,当您到达HasSpaceAvailable 时,不要单独发送长度,因为您已将其放入数据对象中。您只需从指针实例变量发送字节,剩余长度为最大长度。在检查发送的字节数不是 0 或 -1(请参阅 the documentation)后,将其添加到指针并从剩余长度中减去。

    当剩余长度达到零时,您已经发送了所有内容。假设您不想跟踪 JPEG 数据,则可以关闭流。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-09-05
      • 2010-09-20
      • 1970-01-01
      • 2012-09-19
      • 2013-03-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多