CFNetwrok网络请求4

//
//  CFNetworkTest4.m
//  TestCF
//
//  Created by Jabez on 15/5/11.
//  Copyright (c) 2015年 John. All rights reserved.
//

#import "CFNetworkTest4.h"
#import <pthread.h>

@implementation CFNetworkTest4

static CFRunLoopRef backgroundRunLoop;
static pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
static pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

void releaseContext(void *infoPtr) {
    CFRelease(infoPtr);
}

void *retainContext(void *infoPtr) {
    CFRetain(infoPtr);
    return infoPtr;
}

void cancelTheStream(CFReadStreamRef readStream) {
    CFReadStreamUnscheduleFromRunLoop(readStream, CFRunLoopGetCurrent(), kCFRunLoopCommonModes);
    CFReadStreamClose(readStream);
    CFRelease(readStream);
}

void *threadMain(void *info) {
    pthread_mutex_lock(&mutex);
    backgroundRunLoop = CFRunLoopGetCurrent();
    CFRunLoopSourceContext context = {0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL};
    CFRunLoopSourceRef source = CFRunLoopSourceCreate(kCFAllocatorDefault, 0, &context);
    CFRunLoopAddSource(CFRunLoopGetCurrent(), source, kCFRunLoopDefaultMode);
    pthread_cond_signal(&cond);
    pthread_mutex_unlock(&mutex);
    CFRunLoopRun();

    return NULL;
}

void createThread(void) {
    pthread_t threadID;
    pthread_create(&threadID, NULL, threadMain, NULL);
}

void getResponse(CFReadStreamRef readStream, CFStreamEventType type, void *infoPtr) {
    if (type == kCFStreamEventEndEncountered) {
        CFHTTPMessageRef response = (CFHTTPMessageRef)infoPtr;

        CFIndex statusCode = CFHTTPMessageGetResponseStatusCode(response);
        CFDataRef responseData = CFHTTPMessageCopyBody(response);

        CFIndex count = CFDataGetLength(responseData);
        CFStringRef responseJson = CFStringCreateWithBytes(kCFAllocatorDefault, CFDataGetBytePtr(responseData), count, kCFStringEncodingUTF8, YES);
        NSString *jsonString = [NSString stringWithFormat:@"%@", (__bridge NSString *)responseJson];
        NSLog(@"jsongString: %@", jsonString);

        CFRelease(responseJson);
        CFRelease(responseData);
        cancelTheStream(readStream);
    } else if (type == kCFStreamEventHasBytesAvailable) {
        UInt8 buffer[100];
        CFIndex length = CFReadStreamRead(readStream, buffer, 100);
        CFHTTPMessageAppendBytes((CFHTTPMessageRef)infoPtr, buffer, length);
    } else if (type == kCFStreamEventErrorOccurred) {
        cancelTheStream(readStream);
        return;
    }
}

- (void)sendMessage
{
    [self request];
}

- (void)request
{
    CFStringRef urlString = CFSTR("http://jabez.local/~jabez/test/response/response0");
    CFURLRef url = CFURLCreateWithString(kCFAllocatorDefault, urlString, NULL);

    CFStringRef method = CFSTR("POST");

    CFHTTPMessageRef request = CFHTTPMessageCreateRequest(kCFAllocatorDefault, method, url, kCFHTTPVersion1_1);

    CFHTTPMessageSetHeaderFieldValue(request, CFSTR("Content-Type"), CFSTR("application-json"));

    CFStringRef jsonBody = CFSTR("key=Test4");
    CFDataRef jsonData = CFStringCreateExternalRepresentation(kCFAllocatorDefault, jsonBody, kCFStringEncodingUTF8, 0);
    CFHTTPMessageSetBody(request, jsonData);

    CFHTTPMessageRef response = CFHTTPMessageCreateEmpty(kCFAllocatorDefault, NO);
    CFStreamClientContext context = {0, response, retainContext, releaseContext, NULL};

    CFOptionFlags registeredEvent = kCFStreamEventHasBytesAvailable | kCFStreamEventEndEncountered | kCFStreamEventErrorOccurred;
    CFReadStreamRef readStream = CFReadStreamCreateForHTTPRequest(kCFAllocatorDefault, request);
    CFReadStreamSetClient(readStream, registeredEvent, getResponse, &context);

    if (backgroundRunLoop == NULL) {
        createThread();
        pthread_cond_wait(&cond, &mutex);
    }

    CFReadStreamScheduleWithRunLoop(readStream, backgroundRunLoop, kCFRunLoopCommonModes);
    CFReadStreamOpen(readStream);

    CFRelease(url);
    CFRelease(urlString);
    CFRelease(method);
    CFRelease(request);
    CFRelease(jsonBody);
    CFRelease(jsonData);
}

@end

时间: 2024-10-22 02:23:13

CFNetwrok网络请求4的相关文章

CFNetwrok网络请求3

// //  CFNetworkTest3.m //  TestCF // //  Created by Jabez on 15/5/11. //  Copyright (c) 2015年 John. All rights reserved. // #import "CFNetworkTest3.h" @implementation CFNetworkTest3 // good - (void)sendMessage { [self request]; } - (void)reques

ios编程之网络请求

网络请求有GET请求和POST请求,get和post实现的时候可以选择同步或者异步实现.看一个请求是GET还是POST就看网址后面有没有携带请求体. GET与POST 区别 1.get请求 请求的网址全部明文显示 安全性不高 2.get请求 请求的网址 有字符数的限制 大概255个 3.post请求 请求的网址 不光是有一个请求的网址 还可以携带请求体 这个请求体 是以NSData形式存在 安全性较高 4.post请求没有字符数的限制 GET同步和GET异步 同步请求是在请求数据的时候不能做其他

Swift网络请求(Moya篇)

在使用Alamofire进行网络请求的时候,相信大部分的同学都会封装一个抽象的NetworkLayer,如"APIManager" 或者 "NetworkModel"等等.但是位置业务功能增加,会渐渐混合各种请求,不够清晰,而Moya能很好地解决这类问题.Moya在Alamofire基础上进行封装,是一个允许高度自定义的网络层,可以根据具体的需求进行接口的设置.具体的介绍可以参考Moya的官方链接,结构图如下: 接下来就介绍一下Moya的一些常见的用法: (一)根据

微信小程序 网络请求之re.request 和那些坑

微信小程序有四种网络请求类型,下面只详细介绍普通HTTPS请求(wx.request) 普通HTTPS请求(wx.request) 上传文件(wx.uploadFile) 下载文件(wx.downloadFile) WebSocket通信(wx.connectSocket) 首先,先确认是否设置了合法域名,或者在开发环境下不校验合法域名.关于设置合法域名请看→微信小程序 网络请求之设置合法域名   以下是wx.request的详细说明,截图于微信小程序开发文档 在微信index.js 发起一个普

Android网络请求框架AsyncHttpClient实例详解(配合JSON解析调用接口)

最近做项目要求使用到网络,想来想去选择了AsyncHttpClient框架开进行APP开发.在这里把我工作期间遇到的问题以及对AsyncHttpClient的使用经验做出相应总结,希望能对您的学习有所帮助. 首先按照惯例先来简单了解一些AsyncHttpClient网络框架的一些知识. 1.简介 Android中网络请求一般使用Apache HTTP Client或者采用HttpURLConnect,但是直接使用这两个类库需要写大量的代码才能完成网络post和get请求,而使用android-a

Go实战--实现一个自己的网络请求日志httplogger(The way to go)

生命不止,继续go go go~~~ 之前我们简要介绍了go语言中的log package 和 net/http package,那么我们今天就干点实事儿,将二者结合,实现我们自己的日志记录网络请求. 另外,我们还没有跟你介绍time package,但是也可以看懂的. 首先,我默认你了解go语言的组织结构. 导入需要的package 我们需要 log net/http time三个包 package httplogger import ( "log" "net/http&q

Android实际开发之网络请求组件的封装(OkHttp为核心)

趁周末时间撸了两天代码,将OkHttp网络请求框架进行了一次简单封装,对于实际开发非常有用.. 此次封装主要针对我们经常使用的网络请求的步骤进行封装,在已有框架OkHttp的基础上进行实际开发的封装 发送一个网络请求,有以下三个功能模块: 一:request处理 二:OkHttp核心处理 三:callback处理 我们进行网络请求组件的封装也是根据这三大模块进行封装的,下面规划一下这次封装的一个思维导图: 根据以上思维导图,我们第一步,先进行request的封装: 以下是封装的一个CommonR

【Swift】Alamofile网络请求数据更新TableView的坑

写这篇BLOG前,有些话不得不提一下,就仅当发发恼骚吧... 今天下午为了一个Alamofire取得数据而更新TableView的问题,查了一下午的百度(360也是见鬼的一样),竟然没有一个简单明了的回答, 而唯一几个比较接近答案的,说要 self.tableView.reloadData(),也没有贴上代码,说要放在哪个函数内, 都犹抱琵琶半遮面,让初学者自己采坑,于是郁闷了一下午,刚刚回到家,试想想,要不试试英文网,毕竟Swift就是人家老外的, 说不定老外会告诉你,怎么取得数据并绑定Tab

网络请求三方库——OkHttp

我们知道在Android开发中是可以直接使用现成的API进行网络请求的,就是使用 HttpClient 和 HttpURLConnention ,而Android 4.4 之后 HttpClient 已经被废弃,由于此前一直很流行的三方库 android-async-http 是基于 HttpClient 的,所以作者已经放弃了维护 android-async-http 库,我们在项目中也尽量不要使用这个库. OkHttp是Squaur公司开源的一个高性能Http请求库,它的职责同 HttpUR