首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >何时关闭NSOutputStream?

何时关闭NSOutputStream?
EN

Stack Overflow用户
提问于 2009-04-03 07:03:49
回答 1查看 2.2K关注 0票数 2

我想通过套接字将UIImage的数据发送到服务器,所以我:

a)打开NSOutputStream

代码语言:javascript
复制
- (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

代码语言:javascript
复制
- (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?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-04-03 10:37:34

问题是数据一次又一次地写入oSream。当所有数据都已发送时,如何停止?

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

问题是数据一次又一次地写入oSream。当我发送了所有的数据后如何停止它?

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

很大一部分问题是您的HasSpaceAvailable处理程序造成的。下面是你正在做的事情:

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

这是三个问题,您需要解决这三个问题。

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

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

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

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

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/712810

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档