从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; }}