ホームページ  >  記事  >  バックエンド開発  >  PHPソケットを理解する方法

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

王林
王林転載
2020-01-23 19:01:463102ブラウズ

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 サイトの他の関連記事を参照してください。

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