この記事の例では、WebSocket に基づいて PHP で単純なチャット ルームを構築する実践について説明します。皆さんの参考に共有してください。詳細は以下の通りです:
1. はじめに
会社のゲームに簡易チャットルームがあることに気づき、PHPを使って簡易チャットルームを作ろうと思いました。そこで、さまざまな情報を収集し、ドキュメントを読み、事例を探し、簡単なチャット ルームを自分で書きました。
http 接続は、短い接続と長い接続に分けられます。短い接続は通常、ajax を使用して実装でき、長い接続は WebSocket です。短い接続は実装が比較的簡単ですが、消費するリソースが多すぎます。 Websocket は効率的ですが、互換性に関していくつかの問題があります。 WebSocket は HTML5 のリソースです
2. フロントエンド
フロントエンドでの WebSocket の実装は非常に簡単で簡単です
3. WebSocket の難しさは主にバックグラウンドにあります
3.1 websocket の接続プロセス
websocket の通信図 これは、クライアントとサーバー間の通信を示す単純な図です。PHP が主に行うことは、暗号化キーを受け取り、それを返してソケットの作成とハンドシェイク操作を完了することです。 WebSocket を処理するサーバーの図
3.2 コードの練習
サーバーによって実行されるプロセスは大まかに次のとおりです:
ハンドシェイクがない場合はハンドシェイク操作を実行し、ハンドシェイクが完了した場合は、データが解析されて出力用のバッファに書き込まれます
以下はサンプルコードです(クラスを書いたので、コードはそれに応じてセグメント化されています)関数へ))、テキストの最後に github アドレスと私が遭遇したことを示します いくつかの落とし穴
//连接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; }
public function __construct($address,$port) { //建立套接字 $this->soc=$this->createSocket($address,$port); $this->socs=array($this->soc); }
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); } } } } }
エラーがある場合はプロンプトが表示されます
②サーバー経由でHTMLファイルにアクセスします8. 踏んだ落とし穴については、エラーの確認を容易にするためにデバッグを開いてください
①サーバー。 .phpではハングしたプロセスを出力できます。問題がある場合は、デバッグ用にコードに出力を追加できます
各判断で確認できますコードがどのセクションで実行されているかをコンソールにマークします。 、コードを変更した後は、毎回 php server.php スクリプトを再実行する必要があります。接続時にデータを送信します (サーバーとの最初の検証ハンドシェイク中にコンテンツは送信できません)
2。検証されましたが、クライアントが送信しなかったか、送信されたメッセージが空ですしたがって、接続されたソケットのデータを検証するには③可能浏览器不支持或者服务端没有开启socket开始之前最好验证下
if (window.WebSocket){ console.log("This browser supports WebSocket!"); } else { console.log("This browser does not support WebSocket."); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。
更多WebSocket に基づいてシンプルなチャット ルームを構築する PHP の実践相关文章请关注PHP中文网!