ホームページ  >  記事  >  バックエンド開発  >  websocket_php の例に基づいて簡単なチャット ルームを構築する PHP の実践

websocket_php の例に基づいて簡単なチャット ルームを構築する PHP の実践

WBOY
WBOYオリジナル
2016-12-05 13:28:141340ブラウズ

この記事の例では、WebSocket に基づいて PHP で単純なチャット ルームを構築する実践について説明します。皆さんの参考に共有してください。詳細は以下の通りです
1. はじめに

会社のゲームに簡易チャットルームがあることを知り、node+websocketで作られていることに気づき、PHPを使って簡易チャットルームを作ってみようと思いました。そこで、さまざまな情報を収集し、ドキュメントを読み、事例を探し、簡単なチャット ルームを自分で書きました。

http 接続は、短い接続と長い接続に分けられます。短い接続は通常、ajax を使用して実装でき、長い接続は WebSocket です。短い接続は実装が比較的簡単ですが、消費するリソースが多すぎます。 Websocket は効率的ですが、互換性に関していくつかの問題があります。 websocketはhtml5のリソースです

2. フロントエンド

フロントエンドでの WebSocket の実装は非常にシンプルで簡単です

リーリー

3.舞台裏

WebSocket の難しさは主にバックグラウンドにあります

3.1WebSocket接続プロセス
Websocket 通信図 これは、クライアントとサーバー間の単純な通信図です。PHP が行う主な処理は、暗号化キーを受け取り、それを返してソケットの作成とハンドシェイク操作を完了することです。

下の図はサーバー側のWebSocket処理の詳細なフローチャートです


3.2 コードの練習


サーバーによって実行されるプロセスは大まかに次のとおりです:

    接続を待機しているソケットプロセスをハングします
  1. ソケット接続が確立された後、ソケット配列を走査します
  2. ハンドシェイクがない場合は、ハンドシェイク操作を実行します。ハンドシェイクがある場合は、データが解析されて出力用のバッファに書き込まれます。

  3. 以下はサンプルコードです(私がクラスを書いたので、コードは関数に従って分割されています)。テキストの最後には、githubアドレスと私が遭遇したいくつかの落とし穴が示されています。 1. まずソケットを作成します


リーリー

2. ソケットを配列に配置します

リーリー

3. 中断されたプロセスはソケット配列を通過し、主な操作はここで完了します

リーリー

4. ハンドシェイクのプロセスは、WebSocket コンテンツを受信し、Sec-WebSocket-Key: からキーを取得し、それを暗号化アルゴリズムを通じてバッファに書き込むことです (自動検証には当社の処理は必要ありません)。
リーリー


5. クライアントデータを解析します (ここでは暗号化していません。必要に応じて自分で暗号化できます)

リーリー


6. ソケットをバッファに書き込みます

リーリー


7.操作方法

github アドレス git@github.com:rsaLive/websocket.git

①server.phpはコンソールで実行するのがベストです

server.php スクリプト ディレクトリに移動します (最初に php -v を実行して、php が設定されているかどうかを確認できます。Linux 設定がない場合は、bash ウィンドウでパスを設定します)

php -f サーバー.php

エラーがある場合はプロンプトが表示されます

②サーバー経由でHTMLファイルにアクセス

8. 落とし穴を踏んでしまった場合は、デバッグ作業を開いてエラーを簡単に確認してください

①server.phpは、中断されたプロセスで出力を印刷できます。問題がある場合は、コードに印刷を追加してデバッグできます

各判断をマークして、コードがどのセクションで実行されているかをコンソールで確認できます

ただし、コードを変更するたびにスクリプト php server.php を再実行する必要があります

②このエラーが発生する場合は

の可能性があります

1. サーバーとのソケットの初期化時にデータを送信します (サーバーとの最初の検証ハンドシェイク中にコンテンツは送信できません)

2. この状況は、検証されたがクライアントが送信しなかった場合、または送信されたメッセージが空だった場合にも発生します

接続されているソケットのデータを確認してください

③ブラウザがサポートしていないか、サーバーがソケットを開いていない可能性がありますので、開始する前に確認することをお勧めします。

リーリー

以上がこの記事の全内容です。皆様の学習に役立つことを願っております。また、皆様も Script Home をサポートしていただければ幸いです。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。