Objective-C : โพสต์/รับคำขอโดยใช้ Socket

ฉันรู้วิธีส่งคำขอโพสต์ / รับโดยใช้ HTTPClient ใด ๆ ซึ่งได้รับการอธิบาย ที่นี่ และ ที่นี่ . แต่ตอนนี้ฉันมีซ็อกเก็ตสตรีมที่เชื่อมต่อกับเซิร์ฟเวอร์ระยะไกล และฉันต้องการส่งคำขอโพสต์โดยใช้ซ็อกเก็ตนี้

ฉันไม่เคยทำแบบนั้นมาก่อนและไม่เคยพิจารณาแนวคิดของ POST/GET ผ่านซ็อกเก็ตเลย แต่ googling ของฉันทำให้ฉันไปที่ สิ่งนี้ โดยที่การโพสต์จะดำเนินการผ่าน ซ็อกเก็ตจาวา..

ฉันกำลังใช้ไลบรารี CFSocket ที่ Apple เตรียมไว้ให้.. มีวิธีใดบ้างที่ POST/GET ใช้ซ็อกเก็ตใน Objective-C หรือไม่


person Krishnabhadra    schedule 10.11.2011    source แหล่งที่มา


คำตอบ (2)


ฉันสามารถทำ GET/POST โดยใช้ CFSocket ธรรมดาได้

-(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];
    }
}
person Krishnabhadra    schedule 11.11.2011
comment
โหวตขึ้นเนื่องจากตัวอย่างนี้แก้ไขปัญหาสำหรับฉัน (ฉันมีปัญหาด้านไวยากรณ์) แต่ฉันต้องปรับแต่งคำขอของคุณเล็กน้อย - ฉันต้องการการขึ้นบรรทัดใหม่และการป้อนบรรทัดหลังจากรายการ HOST แค่คิดว่าฉันจะพูดถึงมัน ฉันได้รับข้อผิดพลาดคำขอที่ไม่ถูกต้องหากไม่มีมัน - person David Fulton; 28.09.2017

โปรดดูที่ การเขียนโปรแกรมเครือข่าย: บทที่ 7 - การพัฒนาแอปพลิเคชัน iPhone SDK โดย Jonathan Zdziarski คุณยังสามารถอ้างอิง เซิร์ฟเวอร์ HTTP ที่เรียบง่ายและขยายได้ใน Cocoa.

person Parag Bafna    schedule 10.11.2011
comment
ขอบคุณสำหรับคำตอบของเพื่อน คำถามของฉันคือเกี่ยวกับวิธีการขอ GET/POST โดยใช้ CFSocket ธรรมดา ฉันได้เห็นทั้งสองลิงก์นี้แล้วซึ่งมีประโยชน์มาก แต่ไม่มีอะไรเกี่ยวกับการโพสต์/รับการใช้ซ็อกเก็ตในลิงก์ที่สอง ในลิงค์แรกมีข้อมูลเกี่ยวกับ CFHTTP ซึ่งดูมีแนวโน้มดี .. แต่ฉันได้ทำตามข้อกำหนดของฉันโดยใช้ CFSocket ธรรมดาแล้ว ดูคำตอบของฉัน ฉันจะยอมรับคำตอบของฉันในวันพรุ่งนี้เนื่องจาก SO ไม่อนุญาตให้ฉันทำตอนนี้ - person Krishnabhadra; 11.11.2011