0

私は基本的に自分のサーバーに投稿を送信しています。私が書いている文字列は @"POST /api?f=### HTTP/1.1\r\nHost: http://server.loc.a.tion \r\nContent-Type: application/x-www- form-urlencoded\r\nContent-Length: ##\r\n\r\ndata=somedataandstuff". この後、サーバーは私にメッセージを送り返すことになっています。(まだそこまで行ったわけではありません。)

Apple によって並べられた基本的なポーリング コードに従っています、いくつかの変更を加えました。

以下はストリームを開いた後のものです)、data_to_send.buffer は (char *)、data_to_send.buffer_size は 1500 です。

//Preform Write operations
bool done = false;
int bufLen = data_to_send.buffer_size;
const uint8_t * rawstring =(const uint8_t *)data_to_send.buffer;
CFIndex bytesWritten;
while (!done) {
    CFStreamStatus stat = CFWriteStreamGetStatus(writeStream); //for me while debugging
    if (CFWriteStreamCanAcceptBytes(writeStream)) {

        //ADDED:
        if(bufLen > 0)  bytesWritten = CFWriteStreamWrite(writeStream, rawstring, (CFIndex)bufLen);

        //ADDED: to check if it ever writes
        if( CFWriteStreamGetStatus(writeStream) == kCFStreamStatusWriting){
            NSLog(@"lalallaa");
        }

        if (bytesWritten < 0) {
            //error stuff
        } else if (bytesWritten == 0) {
            if (CFWriteStreamGetStatus(writeStream) == kCFStreamStatusAtEnd) {
                done = TRUE;
                rawstring = nil;
            }
        } else if (bytesWritten != bufLen) {
            // Determine how much has been written and adjust the buffer
            bufLen = bufLen - bytesWritten;
            memmove(rawstring, rawstring + bytesWritten, bufLen);

            //error stuff
        } else {  //ADDED
            bufLen = 0;
            bytesWritten = 0;
            //loop and wait until finished
        }

    }
}
CFWriteStreamClose(writeStream);
CFRelease(writeStream);
writeStream = NULL;

CFWriteStreamWrite が完全な 1500 を返すため、コードを変更しました (これは私の頭の中のフラグです: bufLen が 1500 で、それをすべて書き込み、0 を返すべきではありませんか?)。 == bufLen)(これが意図された機能でない限り、アップルは何も見逃さないと私が想定する別のフラグ)。次に、bufLen またはバッファー (rawstring) は変更されず、繰り返し 1500 を返し、終わりのないサイクルを開始します。したがって、これを説明するために、bufLen を 0 に設定し、書き込まれたバイトを 0 に設定する else を追加して、コードが KCFStreamStatusAtEnd に達したときにチェックするためにループするようにしました。これをステップ実行すると、CFWriteStreamWrite を実行すると、ステータスが 2 (CFStreamStatusOpen) までになり、別の終わらないサイクルになることに気付きました。

しかし、サーバーの apache アクセス ログを確認すると、次のようになります。
... "-" 408 -
動作中の呼び出し (動作中の Java コードから行われる) は、次のようになり
ます ... "POST /api?f=blahblah" 200 ##

少なくとも何かが書かれようとしているような気がします。408 ステータスはリクエストのタイムアウトですが。これは、ストリームを開いた状態でデバッグしている間、ストリームがそこにあることが原因である可能性がありますか? または、デバッグして停止したときにストリームを閉じないためですか?

アイデアや提案は大歓迎です。(私はiOS/objective-cが初めてです)

4

1 に答える 1

0

誰かがこれに興味を持っている場合、私は基本的にあきらめて、NSMutableURLrequest を使用しました。

NSString *urlString = @"http://url.ca/api?f=##";
NSMutableURLrequest *request = [NSMutableURLRequest requestWithURL:[NSURL URLWithString:url]];
[request setHTTPMethod:@"POST"];
[request setValue:@"##" for HTTPHeaderField@"Contect-Length"];
[request setValue:@"application/x-www-form-urlencoded" for HTTPHeaderField@"Content-Type"];
[request setHTTPBody:@"data=lalalalala" dataUsingEncoding:NSASCIIStringEncoding]];

NSURLResponse *response;
NSError *err;
NSData *responseData = [NSURLConnection sendSynchronousRequest:request returningResponse:&response error:&err];

//error check & handle data

これが同期的であるため、UIを遅らせるようなことをしたい場合は注意してください(独自のスレッドで実行するか、非同期で実行してください)。これは基本的に、私がコーディングしようとしていたのと同じことを行います。

于 2012-08-20T12:54:02.980 に答える