判断Keep-Alive模式的HTTP请求的结束的实现代码
在使用短连接方式时,每个HTTP请求对应一个TCP连接,请求完成后连接立即断开,服务器返回EOF。
所以根据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请求的结束了。这也是使用长连接时都会遇到的一个问题。目前判断的方法主要有两种:
(1) 根据头中的Content-Length字段。这个字段标明了正文的长度,我们可以以接收完指定长度的字符为判断结束的依据。
(2) 在没有Content-Length时,根据Transfer-Encoding。有些时候服务器无法确定正文的大小,因为正文可能是动态产生的,所以就不会提供Content-Length了,而是采用chunk编码来一块一块地发送正文。每个chunk块由头部和正文两部分组成,头部中由一个16进制数字指定了正文的长度;最后由一个长度为0的chunk块来表示整个HTTP正文的结束。
下面我用PHP实现了有Content-Length时的判断方式:
1. 获得Content-Length值
代码如下:
$length = 0;
$line = '';
while($line !== "\r\n") {
$line = fgets($fp);
if(substr($line, 0, 15) === 'Content-Length:') {
$length = intval(substr($line, 16));
}
}
2. 获得正文
代码如下:
$sum = 0;
while($sum $line = fgets($fp);
$sum += strlen($line);
echo $line;
}

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Java 開発で HTTP リクエストの接続が拒否される問題を解決する方法 Java 開発では、HTTP リクエストの接続が拒否されるという問題によく遭遇します。この問題は、サーバー側でアクセス権が制限されているか、ネットワーク ファイアウォールが HTTP 要求へのアクセスをブロックしているために発生する可能性があります。この問題を解決するには、コードと環境をいくつか調整する必要があります。この記事では、いくつかの一般的な解決策を紹介します。ネットワーク接続とサーバーの状態を確認します。まず、ネットワーク接続が正常であることを確認します。他の Web サイトやサービスにアクセスして確認してください。

http リクエスト エラーの理由の簡単な説明: 504GatewayTimeout: ネットワーク通信中、クライアントは HTTP リクエストを送信することでサーバーと対話します。ただし、リクエストの送信プロセス中にエラー メッセージが表示される場合があります。そのうちの 1 つは 504GatewayTimeout エラーです。この記事では、このエラーの原因と解決策について説明します。 504GatewayTimeout エラーとは何ですか?ゲートウェイタイムオ

http リクエスト エラー: SocketError の解決策 ネットワーク リクエストを行うときに、さまざまなエラーが発生することがよくありますが、その一般的な問題の 1 つが SocketError です。このエラーは、アプリケーションがサーバーとの接続を確立できない場合にスローされます。この記事では、SocketError の一般的な原因と解決策について説明します。まず、Socket とは何かを理解する必要があります。ソケットは、アプリケーションが次のことを可能にする通信プロトコルです。

最初から最後まで: HTTP リクエストに php 拡張機能 cURL を使用する方法 はじめに: Web 開発では、多くの場合、サードパーティ API または他のリモート サーバーと通信する必要があります。 cURL を使用して HTTP リクエストを行うのは、一般的で強力な方法です。この記事では、PHP を使用して cURL を拡張して HTTP リクエストを実行する方法を紹介し、いくつかの実用的なコード例を示します。 1. 準備 まず、php に cURL 拡張機能がインストールされていることを確認します。コマンドラインで php-m|grepcurl を実行して確認できます。

Go で HTTP リクエストのクエリ パラメータを設定するには、クエリ パラメータの名前と値をパラメータとして受け入れる http.Request.URL.Query().Set() メソッドを使用できます。具体的な手順は次のとおりです。 新しい HTTP リクエストを作成します。クエリパラメータを設定するには、Query().Set() メソッドを使用します。リクエストをエンコードします。リクエストを実行します。クエリパラメータの値を取得します(オプション)。クエリパラメータを削除します(オプション)。

PythonHttp リクエストのパフォーマンスを最適化することは、Web アプリケーションの速度と応答性を向上させるために重要です。このガイドでは、ネットワーク アプリケーションのパフォーマンスを向上させるために Python HTTP リクエストを最適化するためのヒントとベスト プラクティスをいくつか紹介します。 1. 接続プーリングを使用します。接続プーリングは、HTTP 接続を管理するためのメカニズムです。これにより、接続の作成と破棄のオーバーヘッドが削減され、HTTP リクエストのパフォーマンスが向上します。 Python は、接続プールのサポートが組み込まれたリクエスト ライブラリを提供します。接続プールを有効にするには、Session オブジェクトを作成するときに pool_connections パラメータを渡すだけで済みます。 importrequestssession=リクエスト.セッション(

Nginx を使用して HTTP リクエストを圧縮および解凍する方法 Nginx は、強力で柔軟な高性能 Web サーバーおよびリバース プロキシ サーバーです。 HTTP リクエストを処理する場合、Nginx が提供する gzip モジュールと Gunzip モジュールを使用してリクエストを圧縮および解凍し、データ送信量を削減し、リクエストの応答速度を向上させることができます。この記事では、Nginx を使用して HTTP リクエストを圧縮および解凍する方法の具体的な手順を紹介し、対応するコード例を示します。 gzipモジュールを構成する

PHP と Exif 拡張機能を使用して写真の測光モードを抽出する方法 写真は画像を媒体とする芸術形式です デジタル写真の時代では、写真の Exif データを通じて撮影パラメータの詳細な情報を取得できます。その中でも測光モードは重要なパラメータであり、写真内で光がどのように測定されているかを知ることができ、写真をより深く理解して分析するのに役立ちます。 PHP プログラミングでは、Exif 拡張機能を使用して写真の Exif データを抽出できます。この記事ではPHPとExifの使い方を紹介します。
