Objective-C : Posting/Dapatkan Permintaan menggunakan Socket

Saya tahu cara mengirim permintaan posting/dapatkan menggunakan HTTPClient apa pun yang dijelaskan di sini dan di sini . Namun sekarang saya memiliki soket aliran yang terhubung ke server jarak jauh dan saya ingin mengirim permintaan kiriman menggunakan soket ini.

Saya belum pernah melakukan itu sebelumnya dan sejujurnya tidak pernah mempertimbangkan konsep POST/GET via socket. Namun googling membawa saya ke ini, di mana postingan dilakukan melalui soket java..

Saya menggunakan perpustakaan CFSocket yang disediakan oleh Apple..Apakah ada cara untuk melakukannya? lakukan POST/GET menggunakan soket di Objective-C?


person Krishnabhadra    schedule 10.11.2011    source sumber


Jawaban (2)


Ya, saya sudah bisa melakukan GET/POST menggunakan CFSocket biasa.

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

Sekarang di fungsi panggilan balik soket Anda, Anda dapat membaca respons http..Semoga ini bisa membantu seseorang..

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
Terpilih karena contoh ini memperbaiki masalah bagi saya (saya mempunyai masalah sintaksis), namun saya harus sedikit mengubah permintaan Anda - saya memerlukan pengembalian kereta dan umpan baris setelah entri HOST. Kupikir aku akan menyebutkannya. Saya mendapat kesalahan permintaan buruk tanpanya. - person David Fulton; 28.09.2017

Lihat Pemrograman Jaringan: Bab 7 - Pengembangan Aplikasi iPhone SDK oleh Jonathan Zdziarski. Anda juga dapat merujuk Server HTTP yang sederhana dan dapat diperluas di Cocoa.

person Parag Bafna    schedule 10.11.2011
comment
Terima kasih atas tanggapannya kawan, Pertanyaan saya adalah tentang bagaimana melakukan permintaan GET/POST menggunakan CFSocket biasa. Saya telah melihat kedua tautan ini, yang sangat membantu. Tapi tidak ada apa pun tentang posting/dapatkan menggunakan soket di tautan kedua. Di link pertama ada informasi tentang CFHTTP yang kelihatannya menjanjikan..Tapi saya sudah menyelesaikan kebutuhan saya menggunakan CFSocket biasa. Lihat jawaban saya. Saya akan menerima jawaban saya besok karena SO tidak mengizinkan saya melakukannya sekarang - person Krishnabhadra; 11.11.2011