首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 操作系统 >

从Samples中入门IOS开发(5)- 基于HTTP的网络编程

2013-01-21 
从Samples中入门IOS开发(五)------ 基于HTTP的网络编程上一篇讲的是如何通过socket进行网络传输,实际上对

从Samples中入门IOS开发(五)------ 基于HTTP的网络编程

上一篇讲的是如何通过socket进行网络传输,实际上对于互联网上的资源,我们更多的是基于http来开发,SimpleURLConnections展示了如何基于http来进行数据传输,这里主要是讲client如何向http服务器请求和传输数据,http服务器端的实现不在此例子范围之内,实际上就是普通的http服务器。

从本例中主要能学到三点:

基于Get下载文件基于Put上传文件基于Post上传文件基于Get下载文件

首先通过URL打开Connection:

- (void)stream:(NSStream *)aStream handleEvent:(NSStreamEvent)eventCode    // An NSStream delegate callback that's called when events happen on our     // network stream.{    #pragma unused(aStream)    assert(aStream == self.producerStream);    switch (eventCode) {        case NSStreamEventOpenCompleted: {            // NSLog(@"producer stream opened");        } break;        case NSStreamEventHasBytesAvailable: {            assert(NO);     // should never happen for the output stream        } break;        case NSStreamEventHasSpaceAvailable: {            // Check to see if we've run off the end of our buffer.  If we have,             // work out the next buffer of data to send.                        if (self.bufferOffset == self.bufferLimit) {                // See if we're transitioning from the prefix to the file data.                // If so, allocate a file buffer.                                if (self.bodyPrefixData != nil) {                    self.bodyPrefixData = nil;                    assert(self.bufferOnHeap == NULL);                    self.bufferOnHeap = malloc(kPostBufferSize);                    assert(self.bufferOnHeap != NULL);                    self.buffer = self.bufferOnHeap;                                        self.bufferOffset = 0;                    self.bufferLimit  = 0;                }                                // If we still have file data to send, read the next chunk.                                 if (self.fileStream != nil) {                    NSInteger   bytesRead;                                        bytesRead = [self.fileStream read:self.bufferOnHeap maxLength:kPostBufferSize];                                        if (bytesRead == -1) {                        [self stopSendWithStatus:@"File read error"];                    } else if (bytesRead != 0) {                        self.bufferOffset = 0;                        self.bufferLimit  = bytesRead;                    } else {                        // If we hit the end of the file, transition to sending the                         // suffix.                        [self.fileStream close];                        self.fileStream = nil;                                                assert(self.bufferOnHeap != NULL);                        free(self.bufferOnHeap);                        self.bufferOnHeap = NULL;                        self.buffer       = [self.bodySuffixData bytes];                        self.bufferOffset = 0;                        self.bufferLimit  = [self.bodySuffixData length];                    }                }                                if ( (self.bufferOffset == self.bufferLimit) && (self.producerStream != nil) ) {                    self.producerStream.delegate = nil;                    [self.producerStream close];                }            }                        // Send the next chunk of data in our buffer.                        if (self.bufferOffset != self.bufferLimit) {                NSInteger   bytesWritten;                bytesWritten = [self.producerStream write:&self.buffer[self.bufferOffset] maxLength:self.bufferLimit - self.bufferOffset];                if (bytesWritten <= 0) {                    [self stopSendWithStatus:@"Network write error"];                } else {                    self.bufferOffset += bytesWritten;                }            }        } break;        case NSStreamEventErrorOccurred: {            NSLog(@"producer stream error %@", [aStream streamError]);            [self stopSendWithStatus:@"Stream open error"];        } break;        case NSStreamEventEndEncountered: {            assert(NO);     // should never happen for the output stream        } break;        default: {            assert(NO);        } break;    }}

基于Post的数据传输看上去很复杂,实际上道理还是很简单,重点就在于数据流的拼接上。

热点排行