@Rob Napier @Eric Nelsonあなたが言ったように、「NSURLConnectionは、HTTP / 1.1を使用し、既存の接続を再利用するためにこれを処理するのに十分賢いです」。しかし、私はそれについてのAppleの文書にはそのような説明を見つけることができません。
明確にするために、私はそれをテストするためにいくつかのコードを書きます:
- (IBAction)onClickSend:(id)sender {
[self sendOneRequest];
}
-(void)sendOneRequest {
NSURL *url = [NSURL URLWithString:@"http://192.168.1.100:1234"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
[request setHTTPMethod:@"POST"];
[request addValue:[Base64 encodeFromString:kValueVersion] forHTTPHeaderField:kKeyVersion];
[request addValue:[Base64 encodeFromString:kValueDataTypeCmd] forHTTPHeaderField:kKeyDataType];
[request addValue:[Base64 encodeFromString:@"Test"] forHTTPHeaderField:kKeyCmdName];
[request addValue:[Base64 encodeFromString:@"Test"] forHTTPHeaderField:kKeyDeviceName];
[request addValue:[Base64 encodeFromString:@"xxdafadfadfa"] forHTTPHeaderField:kKeyDTLCookies];
NSURLConnection *connection = [[NSURLConnection alloc] initWithRequest:request delegate:self];
[connection start];
}
次に、「(tcp.flags.syn == 1)||(tcp.flags == 0x0010 && tcp.seq == 1 && tcp」を使用して、wiresharkを起動してサーバー(192.168.1.xxx)上のパッケージをキャッチします。 .ack == 1)"tcp3ウェイハンドシェイクをフィルタリングします。残念ながら、「sendOneRequest」を呼び出すたびに3ウェイハンドシェイクが発生することがあります。つまり、NSURLConnectionは既存の接続を再利用していないようです。私のコードの何が問題になっているのか、NSURLConnectionによる1つのソケット接続を介して複数のリクエストを送信する方法を誰かが指摘できますか?
リクエストを送信する同期方法も試しました:
-(void)sendOneRequest {
NSURL *url = [NSURL URLWithString:@"http://192.168.1.100:1234"];
NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL:url];
[request setHTTPMethod:@"POST"];
[request addValue:[Base64 encodeFromString:kValueVersion] forHTTPHeaderField:kKeyVersion];
[request addValue:[Base64 encodeFromString:kValueDataTypeCmd] forHTTPHeaderField:kKeyDataType];
[request addValue:[Base64 encodeFromString:@"Test"] forHTTPHeaderField:kKeyCmdName];
[request addValue:[Base64 encodeFromString:@"Test"] forHTTPHeaderField:kKeyDeviceName];
[request addValue:[Base64 encodeFromString:@"xxdafadfadfa"] forHTTPHeaderField:kKeyDTLCookies];
[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
sleep(1);
[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
sleep(1);
[NSURLConnection sendSynchronousRequest:request returningResponse:nil error:nil];
}
そして結果は同じです。
======= UPDATE ============================
最後に、私のテストがロブやエリックの言うことと異なる理由を見つけました。要するに、ロブとエリックは正しいです。また、NSURLConnectionは、HTTP / 1.1を使用するためのデフォルトとして「keep-alive」を使用し、既存のソケット接続を再利用しますが、比較的短い時間枠でのみ使用されます。
ただし、NSURLConnectionには、「チャンク転送コーディング」(つまり、content-lengthなし)に関していくつかの問題があります。
私のテストでは、サーバー側がコンテンツの長さと応答データなしで応答を送信し、それがチャンク化された応答であり、NSURLConnectionが接続を閉じるため、http投稿ごとに3ウェイハンドシェイクが発生します。
サーバーコードを変更し、応答の長さを0に設定しましたが、動作は正しいです。