Ios 目标C:使用套接字发布/获取请求

Ios 目标C:使用套接字发布/获取请求,ios,objective-c,sockets,post,Ios,Objective C,Sockets,Post,我知道如何使用任何HTTPClient发送post/get请求,并对此进行了解释和说明。但是现在我有一个连接到远程服务器的流套接字,我想用这个套接字发送post请求 我以前从来没有这样做过,坦率地说,我也从来没有考虑过POST/GET via套接字的概念。但我的谷歌搜索让我找到了,在那里,帖子是通过java套接字完成的 我正在使用苹果公司提供的库。在Objective-C中是否有使用socket进行POST/GET操作的方法?请参考。您也可以参考。参考。您也可以参考。好吧,我已经能够使用普通的C

我知道如何使用任何HTTPClient发送post/get请求,并对此进行了解释和说明。但是现在我有一个连接到远程服务器的流套接字,我想用这个套接字发送post请求

我以前从来没有这样做过,坦率地说,我也从来没有考虑过POST/GET via套接字的概念。但我的谷歌搜索让我找到了,在那里,帖子是通过java套接字完成的


我正在使用苹果公司提供的库。在Objective-C中是否有使用socket进行POST/GET操作的方法?

请参考。您也可以参考。

参考。您也可以参考。

好吧,我已经能够使用普通的CFSocket完成GET/POST

-(bool) sendHTTPHeader{
    NSMutableString* requestString  =   [[NSMutableString alloc] init];
    NSString *pathString            =   [NSString stringWithFormat:@"/remote_function.jsp?argument1=%@&argument2=%@",arg1,arg2 ];
    [requestString appendFormat:@"GET %@ HTTP/1.x\r\n",pathString];
    [requestString appendFormat:@"HOST:%@",your_host_here];
    [requestString appendFormat:@"User-Agent:any\r\n"];
    [requestString appendFormat:@"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n\r\n"];
    /*If there are more parameters requested by server, put them here..*/

    const char* sendString          =   [requestString UTF8String];

    CFDataRef  data                 =   CFDataCreate(NULL, (const UInt8*)sendString, strlen(sendString));
    CFSocketError err               =   CFSocketSendData(clientSocket, NULL, data, 0);
    if (err != kCFSocketSuccess) {
        NSLog(@"Error in sending data to the server");
        CFRelease(data);
        return FALSE;
    }
    [requestString release];
    CFRelease(data);
    return TRUE;
}
现在,在套接字回调函数中,您可以读取http响应。希望这将对某人有所帮助

void socketCallback(CFSocketRef socket,CFSocketCallBackType type,CFDataRef address,const void *data,void *info){
    if (type == kCFSocketDataCallBack) {
        NSData *nsData              =   (NSData *)data;
        if ([nsData length] == 0) {
            NSLog(@"Connection dropped by remote socket");
            return;
        }
        //Control reaches here when there is a chunk of data to read
        CFDataRef df                =   (CFDataRef) data;
        int len                     =   CFDataGetLength(df);
        CFRange range               =   CFRangeMake(0,len);
        UInt8 buffer[len+1];

        if(len <= 0) {
            NSLog(@"No data read");
            return;        
        }
        memset((void*)buffer,0,sizeof(buffer));
        CFDataGetBytes(df, range, buffer);
        NSString *byteString            =   [[NSString alloc] initWithBytes:buffer length:len encoding:NSUTF8StringEncoding];
        NSLog(@"byte string is : %@",byteString);
        [byteString release];
    }
}
void socketCallback(CFSocketRef套接字、CFSocketCallBackType类型、CFDataRef地址、const void*数据、void*信息){
if(类型==kCFSocketDataCallBack){
NSData*NSData=(NSData*)数据;
如果([nsData长度]==0){
NSLog(@“远程套接字断开的连接”);
返回;
}
//当有一块数据要读取时,控件到达此处
CFDataRef df=(CFDataRef)数据;
int len=CFDataGetLength(df);
CFRange范围=CFRangeMake(0,len);
UInt8缓冲区[len+1];

如果(len那么我已经能够使用普通的CFSocket进行GET/POST了

-(bool) sendHTTPHeader{
    NSMutableString* requestString  =   [[NSMutableString alloc] init];
    NSString *pathString            =   [NSString stringWithFormat:@"/remote_function.jsp?argument1=%@&argument2=%@",arg1,arg2 ];
    [requestString appendFormat:@"GET %@ HTTP/1.x\r\n",pathString];
    [requestString appendFormat:@"HOST:%@",your_host_here];
    [requestString appendFormat:@"User-Agent:any\r\n"];
    [requestString appendFormat:@"Accept-Charset: ISO-8859-1,utf-8;q=0.7,*;q=0.7\r\n\r\n"];
    /*If there are more parameters requested by server, put them here..*/

    const char* sendString          =   [requestString UTF8String];

    CFDataRef  data                 =   CFDataCreate(NULL, (const UInt8*)sendString, strlen(sendString));
    CFSocketError err               =   CFSocketSendData(clientSocket, NULL, data, 0);
    if (err != kCFSocketSuccess) {
        NSLog(@"Error in sending data to the server");
        CFRelease(data);
        return FALSE;
    }
    [requestString release];
    CFRelease(data);
    return TRUE;
}
现在,在套接字回调函数中,您可以读取http响应。希望这将对某人有所帮助

void socketCallback(CFSocketRef socket,CFSocketCallBackType type,CFDataRef address,const void *data,void *info){
    if (type == kCFSocketDataCallBack) {
        NSData *nsData              =   (NSData *)data;
        if ([nsData length] == 0) {
            NSLog(@"Connection dropped by remote socket");
            return;
        }
        //Control reaches here when there is a chunk of data to read
        CFDataRef df                =   (CFDataRef) data;
        int len                     =   CFDataGetLength(df);
        CFRange range               =   CFRangeMake(0,len);
        UInt8 buffer[len+1];

        if(len <= 0) {
            NSLog(@"No data read");
            return;        
        }
        memset((void*)buffer,0,sizeof(buffer));
        CFDataGetBytes(df, range, buffer);
        NSString *byteString            =   [[NSString alloc] initWithBytes:buffer length:len encoding:NSUTF8StringEncoding];
        NSLog(@"byte string is : %@",byteString);
        [byteString release];
    }
}
void socketCallback(CFSocketRef套接字、CFSocketCallBackType类型、CFDataRef地址、const void*数据、void*信息){
if(类型==kCFSocketDataCallBack){
NSData*NSData=(NSData*)数据;
如果([nsData长度]==0){
NSLog(@“远程套接字断开的连接”);
返回;
}
//当有一块数据要读取时,控件到达此处
CFDataRef df=(CFDataRef)数据;
int len=CFDataGetLength(df);
CFRange范围=CFRangeMake(0,len);
UInt8缓冲区[len+1];

如果(len感谢你的回复,朋友,我的问题是关于如何使用普通的CFSocket进行GET/POST请求。我已经看到了这两个链接,它们都非常有用。但是在第二个链接中没有关于POST/GET using socket的内容。在第一个链接中有关于CFHTTP的信息,看起来很有希望。但是我已经完成了我的请求。)I使用普通CFSocket进行请求。查看我的答案。我明天将接受我的答案,因此不允许我现在这样做。感谢您的回复朋友,我的问题是关于如何使用普通CFSocket进行GET/POST请求。我已经看到了这两个链接,它们非常有用。但是第二个li中没有关于POST/GET使用套接字的内容nk.在第一个链接中,有关于CFHTTP的信息,看起来很有希望..但是我已经用普通的CFSocket完成了我的要求。请看我的答案。我明天会接受我的答案,因为不允许我现在就这么做,因为这个例子为我解决了一个问题(我有一个语法问题),但是我不得不稍微调整您的请求-我需要在“主机”条目后使用回车符和换行符。我想我应该提到它。没有它,我得到了一个糟糕的请求错误。由于此示例为我修复了一个问题(我有一个语法问题),但是我不得不稍微调整你的请求-在“主机”条目之后我需要回车和换行。我只是想提一下。没有它,我得到了一个糟糕的请求错误。