4

我正在玩 GCDAsyncSocket (MRC / iOS5.1) 一段时间,尤其是“大”文件 (5 - 10 mb)。不幸的是,有时读取流永远不会完成(例如,它被卡住了)只有几个字节在流的末尾;didReadPartialDataOfLength:停止向我提供信息并且根本didReadData没有被解雇。

这是我的一些代码(对于编写/阅读示例,主机和客户端之间的连接已经建立)

写作

#define kHeadTag 0
#define kDataTag 1

typedef struct {
    NSUInteger size;
} head_t;

-(void)sendData:(NSData *)__data  {
    _sendData = [__data retain];

    head_t header;
    header.size = __data.length;
    [_socket writeData:[NSData dataWithBytes:&header
                                   length:sizeof(header)]
       withTimeout:-1
       tag:kHeadTag];
}

-(void)socket:(GCDAsyncSocket *)sock
       didWriteDataWithTag:(long)tag {
    if (tag == kHeadTag) {
        [sock writeData:_sendData withTimeout:-1 tag:kDataTag];
        [_sendData release];
        _sendData = nil;
    }
}

阅读

-(void)socket:(GCDAsyncSocket *)sock
       didReadData:(NSData *)data
       withTag:(long)tag {
    switch (tag) {            
            // ------------------------------------- HEAD
        case kHeadTag:{
            head_t head;
            [data getBytes:&head length:sizeof(head)];
            _readHead = head;
            NSLog(@"Received header (total size = %i bytes)", head.size);
            [sock readDataToLength:head.size
                withTimeout:-1
                tag:kDataTag];
        }
            break;

            // ------------------------------------- BODY
        case kDataTag: {
             NSLog(@"Data received with %i bytes", data.length);
             [sock readDataToLength:sizeof(head_t) withTimeout:-1 tag:kHeadTag];
        }
            break;
    }
};

-(void)socket:(GCDAsyncSocket *)sock
       didReadPartialDataOfLength:(NSUInteger)partialLength
       tag:(long)tag {
    if (tag == kDataTag) {
        NSLog(@"Data read with %i bytes", partialLength);
    }
};

我希望这是足够的代码来查看我做错了什么,或者这对于写入/读取大块数据来说是一种不好的做法。

4

1 回答 1

0


[self.partnerSocket writeData:[GCDAsyncSocket CRLFData] withTimeout:-1 tag:0]; 在 sendData: 方法的末尾添加了,它对我来说很好用。您只需在数据末尾附加分隔符。我可以将大约 48MB 的文件从一个 iDevice 传输到另一个 iDevice

于 2015-07-02T07:26:11.713 回答