検索
ホームページバックエンド開発PHPの問題PHPソケットを理解する方法

PHPソケットを理解する方法

Jan 23, 2020 pm 07:01 PM
phpsocket

PHPソケットを理解する方法

#ソケットとは何ですか?

ソケットは、アプリケーション層とトランスポート層の間の抽象化層であり、TCP/IP 層の複雑な操作を、アプリケーション層がネットワーク内の実装プロセスを呼び出すためのいくつかの単純なインターフェイスに抽象化します。 。 コミュニケーション。ソケットは UNIX から生まれました。すべてはファイルであるという UNIX の考えでは、プロセス間通信はファイル記述子と呼ばれます。ソケットは「オープン、読み取り/書き込み、クローズ」モードの実装です。サーバーとクライアント各クライアントは「ファイル」を保持します。接続が確立され、開かれた後、相手が読み取るためにコンテンツをファイルに書き込んだり、相手のコンテンツを読み取ることができます。通信が終了すると、ファイルは閉じられます。

図はソケットの場所を示しています:

PHPソケットを理解する方法

ソケット通信プロセス

ソケットは、異なる間の通信を保証します。コンピュータ通信、つまりネットワーク通信です。 Web サイトの場合、通信モデルはサーバーとクライアント間の通信です。両端で Socket オブジェクトが確立され、Socket オブジェクトを介してデータが送信されます。通常、サーバーは無限ループに陥り、クライアントの接続を待機します。

関連する学習ビデオ チュートリアルの共有:

php ビデオ チュートリアル

次の図は、接続指向の TCP タイミング ダイアグラムです:

PHPソケットを理解する方法

クライアント プロセス: #クライアント プロセスは比較的単純で、ソケットを作成し、サーバーに接続し、ソケットをリモート ホストに接続します (注: TCP のみがUDP、ICMP、ARP などの一部のソケットには「接続」の概念がありません)、データ交換が完了するまでデータを送信し、応答データを読み取り、接続を閉じ、TCP 会話を終了します。

PHPソケットを理解する方法send() メソッドもここで使用できます。違いは、sendall() は戻る前にすべてのデータの送信を試行し、成功すると None を返しますが、send( ) バイト数を送信するために戻ります。失敗すると例外がスローされます。

サーバー側のプロセス:

サーバー側のプロセスについて説明します。サーバーはまずソケットを初期化し、ストリーミング ソケットを確立し、ローカル マシンと通信します。アドレスとポートをバインドし、接続を受信する準備ができたことを TCP に通知し、accept() を呼び出してブロックし、クライアントからの接続を待ちます。この時点でクライアントがサーバーとの接続を確立すると、クライアントはデータ要求を送信し、サーバーは要求を受信して​​処理し、応答データをクライアントに送信し、クライアントはデータ交換が行われるまでデータを読み取ります。完成されました。最後に、接続が閉じられ、対話が終了します。

PHPソケットを理解する方法accept() が呼び出されると、Socket は待機状態になります。クライアントが接続を要求すると、メソッドは接続を確立してサーバーに戻ります。 accept() は 2 つの要素 (conn、addr) を含むタプルを返します。最初の要素 conn は、サーバーがクライアントと通信するために使用する新しい Socket オブジェクトで、2 番目の要素 addr はクライアントの IP アドレスとポートです。 data = conn.recv(1024)

次のステップは処理フェーズです。ここでは、サーバーとクライアントが send() と recv() を通じて通信 (データ送信) します。

サーバーは send() を呼び出し、文字列の形式で情報をクライアントに送信します。send() は送信された文字数を返します。

サーバーは、recv() を呼び出してクライアントから情報を受け取ります。 recv() を呼び出すとき、サーバーは、このメソッド呼び出しで受信できるデータの最大量に対応する整数を指定する必要があります。 recv() はデータを受信するとブロック状態に入り、最終的に受信データを表す文字列を返します。送信されるデータの量が、recv() で許可される量を超える場合、データは切り捨てられます。過剰なデータは受信側でバッファリングされます。今後、recv() が呼び出されるとき、残りのバイトは引き続き読み取られます。過剰なデータがある場合は、バッファーから削除されます (クライアントも同様に、最後のrecv()呼び出し以降に送信されたデータ)、その他のデータ)。送信が完了すると、サーバーは Socket の close() を呼び出して接続を閉じます。

TCP 接続の観点からソケット プロセスを見てみましょう:

TCP スリーウェイ ハンドシェイクのソケット プロセス:

1. サーバーは、socket()、bind()、および listen() を呼び出して初期化を完了した後、accept() を呼び出してブロックして待機します;

2. クライアントの Socket オブジェクトが connect を呼び出します() サーバーにメッセージを送信します。SYN とブロッキング;

3. サーバーは最初のハンドシェイクを完了します。つまり、SYN 応答と ACK 応答を送信します。

4. クライアントが受信した後サーバーから送信された応答 connect() 戻り、サーバーに ACK を送信します;

5. サーバーの Socket オブジェクトは、クライアントの 3 回目のハンドシェイク ACK 確認を受け取ります。このとき、サーバーは accept( ) 接続を確立します。

次のステップでは、両端の接続オブジェクトが相互にデータを送受信します。

TCP ソケット プロセスの 4 つのウェーブ:

PHPソケットを理解する方法

1. アプリケーション プロセスは close() を呼び出し、アクティブに閉じて FIN を送信します;

2. もう一方の端が FIN を受信した後、受動的にソケットを閉じて ACK 確認を送信します;

3. その後、受動的にシャットダウンを実行するアプリケーション プロセスが close() を呼び出してソケットを閉じます。 sends a FIN;

4. この FIN を受信した側は、相手側からの ACK で応答します。

要約:

上記のコードは、Socket の基本機能の使用法を示しているだけですが、実際には、ネットワーク プログラムがどれほど複雑であっても、これらの基本機能は使用されます。上記のサーバー コードは、次のクライアント リクエストを処理する前に 1 つのクライアント リクエストのみを処理します。このようなサーバーの処理能力は非常に弱いです。実際には、サーバーには同時処理機能が必要です。同時処理を実現するには、サーバーはフォークする必要があります。新しいプロセスまたはスレッドがリクエストを処理します。

おすすめの関連記事とチュートリアル: php チュートリアル

以上がPHPソケットを理解する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明
この記事は博客园で複製されています。侵害がある場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。