Keep-AliveモードのHTTP要求の終了を判断する実現コード
1360 ワード
したがって、EOFによって一回の要求の終了が判断されます。下記のコード(PHP)はよく見られます。
// $fp fsockopen()
while(!feof($fp)) {
echo fgets($fp);
}
(注:短い接続モードは頭に「Connection:close」と表示され、長い接続用の「Connection:keep-alive」と表示されます。現在HTTP/1.0はデフォルトでは短い接続を使用しています。HTTP/1.1はデフォルトでは長い接続を使用しています。)長い接続(持久接続ともいう)モードのHTTPは、データを送信した後、サーバーが接続を継続して開くのではなく、次のHTTP要求を残している時に使用するので、長い接続の利点は明らかであり、一つのTCP接続を共有することによって、後で要求するときに接続を確立/切断するオーバーヘッドを節約することができる。EOFはこのTCP接続が終了するまで(タイムアウトやエラー)送信されますので、上記の方法でHTTP要求の終了を判断することはできません。これも長い接続を使う時に発生する問題です。現在の判断の方法は主に2つあります。このフィールドには本文の長さが表示されています。指定された長さの文字を受信した後で判断が終わる根拠となります。2)Contint-Lengthがない場合は、Transfer-Enccodingによる。サーバーが本文のサイズを決定できない場合があります。本文は動的に生成されるかもしれないので、Conteet-Lengthを提供しないで、chunkコードを使ってテキストを一ブロックずつ送ります。各chunkブロックは頭と本文の二つの部分からなり、頭の中に一つの16進数で本文の長さを指定しました。最後に、長さ0のchunkブロックでHTTP本文全体の終了を表します。PHPでContent-Lengthがあるときの判断方法を実現しました。1.Contint-Length値
$length = 0;
$line = '';
while($line !== "\r
") {
$line = fgets($fp);
if(substr($line, 0, 15) === 'Content-Length:') {
$length = intval(substr($line, 16));
}
}
を取得しました。本文
$sum = 0;
while($sum < $length) {
$line = fgets($fp);
$sum += strlen($line);
echo $line;
}
を取得しました。