WebSocket に基づいてシンプルなチャット ルームを構築する PHP の実践

高洛峰
リリース: 2016-12-22 10:01:10
オリジナル
1082 人が閲覧しました

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

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

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

2. フロントエンド

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

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

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


3.2 コードの練習WebSocket に基づいてシンプルなチャット ルームを構築する PHP の実践

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

ソケットプロセスをハングして接続を待ちます

ソケット接続が確立された後、ソケット配列を走査します。

WebSocket に基づいてシンプルなチャット ルームを構築する PHP の実践ハンドシェイクがない場合はハンドシェイク操作を実行し、ハンドシェイクが完了した場合は、データが解析されて出力用のバッファに書き込まれます


以下はサンプルコードです(クラスを書いたので、コードはそれに応じてセグメント化されています)関数へ))、テキストの最後に github アドレスと私が遭遇したことを示します いくつかの落とし穴

1. まずソケットを作成します

//连接websocket
 
var ws = new WebSocket("ws://127.0.0.1:8000");
 
//成功连接websoc的时候
 
ws.onopen = function(){}
 
//成功获取服务端输出的消息
 
ws.onmessage = function(e){}
 
//连接错误的时候
ws.onerror = function(){}
 
//向服务端发送数据
 
ws.send();
ログイン後にコピー

2. ソケットを配列に入れます

//建立套接字
    public function createSocket($address,$port)
    {
      //创建一个套接字
      $socket= socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
      //设置套接字选项
      socket_set_option($socket, SOL_SOCKET, SO_REUSEADDR, 1);
      //绑定IP地址和端口
      socket_bind($socket,$address,$port);
      //监听套接字
      socket_listen($socket);
      return $socket;
    }
ログイン後にコピー



3. ソケット配列を走査するプロセスを一時停止します。主な操作はここで完了します

public function __construct($address,$port)
    {
      //建立套接字
      $this->soc=$this->createSocket($address,$port);
      $this->socs=array($this->soc);
 
    }
ログイン後にコピー

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

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

public function run(){
      //挂起进程
      while(true){
        $arr=$this->socs;
        $write=$except=NULL;
        //接收套接字数字 监听他们的状态
        socket_select($arr,$write,$except, NULL);
        //遍历套接字数组
        foreach($arr as $k=>$v){
          //如果是新建立的套接字返回一个有效的 套接字资源
          if($this->soc == $v){
            $client=socket_accept($this->soc);
            if($client <0){
              echo "socket_accept() failed";
            }else{
              // array_push($this->socs,$client);
              // unset($this[]);
              //将有效的套接字资源放到套接字数组
              $this->socs[]=$client;
            }
          }else{
            //从已连接的socket接收数据 返回的是从socket中接收的字节数
            $byte=socket_recv($v, $buff,20480, 0);
            //如果接收的字节是0
            if($byte<7)
              continue;
            //判断有没有握手没有握手则进行握手,如果握手了 则进行处理
            if(!$this->hand[(int)$client]){
              //进行握手操作
              $this->hands($client,$buff,$v);
            }else{
              //处理数据操作
              $mess=$this->decodeData($buff);
                //发送数据
              $this->send($mess,$v);
            }
          }
        }
      }
    }
ログイン後にコピー

6. ソケットをバッファに書き込む

7. メソッドの実行

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

①server.php を実行するのが最適ですコンソールで

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

php -fserver.php

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

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

WebSocket に基づいてシンプルなチャット ルームを構築する PHP の実践8. 踏んだ落とし穴については、エラーの確認を容易にするためにデバッグを開いてください

①サーバー。 .phpではハングしたプロセスを出力できます。問題がある場合は、デバッグ用にコードに出力を追加できます

各判断で確認できますコードがどのセクションで実行されているかをコンソールにマークします。 、コードを変更した後は、毎回 php server.php スクリプトを再実行する必要があります。接続時にデータを送信します (サーバーとの最初の検証ハンドシェイク中にコンテンツは送信できません)WebSocket に基づいてシンプルなチャット ルームを構築する PHP の実践

2。検証されましたが、クライアントが送信しなかったか、送信されたメッセージが空です

したがって、接続されたソケットのデータを検証するには

WebSocket に基づいてシンプルなチャット ルームを構築する PHP の実践

③可能浏览器不支持或者服务端没有开启socket开始之前最好验证下

if (window.WebSocket){
  console.log("This browser supports WebSocket!");
} else {
  console.log("This browser does not support WebSocket.");
}
ログイン後にコピー

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。

更多WebSocket に基づいてシンプルなチャット ルームを構築する PHP の実践相关文章请关注PHP中文网!

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のおすすめ
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート