したがって、リクエストの終了は EOF に基づいて判断できます。次のコード (PHP) が非常に一般的です:
コードをコピー コードは次のとおりです:
// $fp は、によって生成されたハンドルです。 fsockopen()
while(! feof($fp)) {
echo fgets($fp);
(注: 短い接続モードにはヘッダーに「Connection: close」とマークが付けられ、長い接続モードには現在、HTTP/1.0 はデフォルトで短い接続を使用し、HTTP/1.1 はデフォルトで長い接続を使用します。)
長い接続 (永続的な接続とも呼ばれます) モードのサーバーは、接続を切断しません。データ送信後に接続を維持しますが、それを次の HTTP リクエストまで保持します。これを使用すると、TCP 接続を共有することで、後続のリクエスト中の接続の確立/切断のオーバーヘッドが節約できることが明らかです。 TCP 接続が終了(タイムアウトまたはエラー)するまで EOF は送信されないため、上記の方法では HTTP リクエストの終了を判断できません。これは、長い接続を使用する場合にも発生する問題です。現在、主に 2 つの判断方法があります:
(1) ヘッダーの Content-Length フィールドに基づく。このフィールドはテキストの長さを示し、指定された長さの文字を受信することに基づいて終了を判断できます。
(2) Content-Lengthがない場合、Transfer-Encodingに基づく。テキストが動的に生成される可能性があるため、サーバーがテキストのサイズを判断できない場合があるため、Content-Length が提供されず、代わりにチャンク エンコーディングが使用されてテキストを部分ごとに送信します。各チャンク ブロックは、ヘッダーとボディの 2 つの部分で構成されます。ヘッダー内の 16 進数はボディの長さを指定します。最後に、長さ 0 のチャンク ブロックは HTTP ボディ全体の終わりを示します。
以下では、Content-Length がある場合の判定メソッドを PHP を使用して実装します。
1. Content-Length の値を取得します
コードをコピーします コードは次のとおりです:
$length = 0; $line = '';
while($line !== "rn") {
$line = fgets($fp);
if(substr($line, 0, 15) === 'コンテンツの長さ:' ) {
$length = intval(substr($line, 16));
}
}
2. テキストを取得します
コードは次のとおりです: $sum = 0; while($sum < $length ) {
$line = fgets($fp)
$sum += strlen($line);
以上、Galaxy s4 activeの内容も含め、Keep-AliveモードにおけるHTTPリクエストの終了を判定するための実装コードを紹介しました。PHPチュートリアルに興味のある友人の参考になれば幸いです。