WebSocketとは何ですか?
WebSocket は、非永続的な http と比較される永続的なプロトコルです。 簡単な例を挙げると、 http1.0 のライフサイクルはリクエスト、つまりリクエストとレスポンスによって定義されます。 http の場合、クライアントとサーバー間のセッションは http1.1 で終了します。改善されました。つまり、キープアライブが追加されました。つまり、複数のリクエスト要求と複数の応答受け入れ操作を 1 つの http 接続で実行できるようになりました。ただし、リアルタイム通信では、HTTP リクエストはクライアントによってのみ開始され、サーバーは情報を返すことができません。つまり、サーバーはクライアントに情報を積極的にプッシュすることができず、要件を満たすことができません。リアルタイム通信のこと。 WebSocket は永続的な接続を実行できます。つまり、クライアントはハンドシェイクのみを実行する必要があり、成功後にデータ通信を続行できます。WebSocket はクライアントとサーバー間の全二重通信を実装していること、つまりサーバーがデータ通信を継続できることは注目に値します。データがクライアントにプッシュされるときにアクティブに通信します。
次の図は、クライアントとサーバーの間で WebSocket 接続を確立するときのハンドシェイク部分を示しています。ノードによって提供されるネット モジュールは、開発者が使用するだけですでにカプセル化されているため、ノード内で非常に簡単に完了できます。接続の確立に対処することなく、データの相互作用を考慮する必要があります。
ソケット確立時のクライアントとサーバー間のハンドシェイク、つまりリクエストとレスポンスの会話内容
a、WebSocket確立時にクライアントがサーバーに要求する情報
GET /chat HTTP/1.1 Host: server.example.com Upgrade: websocket //告诉服务器现在发送的是WebSocket协议 Connection: Upgrade Sec-WebSocket-Key: x3JJHMbDL1EzLkh9GBhXDw== //是一个Base64 encode的值,这个是浏览器随机生成的,用于验证服务器端返回数据是否是WebSocket助理 Sec-WebSocket-Protocol: chat, superchat Sec-WebSocket-Version: 13 Origin: php.cn
b、サーバーが取得 クライアントが要求した情報を受信した後、データはWebSocketプロトコルに従って処理されて返されます。この際、Sec-WebSocket-Keyの暗号化やその他の操作が必要です
HTTP/1.1 101 Switching Protocols Upgrade: websocket //依然是固定的,告诉客户端即将升级的是Websocket协议,而不是mozillasocket,lurnarsocket或者shitsocket Connection: Upgrade Sec-WebSocket-Accept: HSmrc0sMlYUkAGmm5OPpG2HaGWk= //这个则是经过服务器确认,并且加密过后的 Sec-WebSocket-Key,也就是client要求建立WebSocket验证的凭证 Sec-WebSocket-Protocol: chat
PHPでソケットを確立するプロセスを説明します
1. PHPでは、まず、PHPでソケット通信を確立し、ポート情報をリッスンします。以下の通り:
<?php //传相应的IP与端口进行创建socket操作 function WebSocket($address,$port){ $server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP); socket_set_option($server, SOL_SOCKET, SO_REUSEADDR, 1);//1表示接受所有的数据包 socket_bind($server, $address, $port); socket_listen($server);return $server; } ?>
2. WebSocket チャネルを一時停止してデータを受信、処理、送信するループを設計します。
<?php //对创建的socket循环进行监听,处理数据 function run(){ //死循环,直到socket断开 while(true){ $changes=$this->sockets; $write=NULL; $except=NULL; /* //这个函数是同时接受多个连接的关键,我的理解它是为了阻塞程序继续往下执行。 socket_select ($sockets, $write = NULL, $except = NULL, NULL); $sockets可以理解为一个数组,这个数组中存放的是文件描述符。当它有变化(就是有新消息到或者有客户端连接/断开)时,socket_select函数才会返回,继续往下执行。 $write是监听是否有客户端写数据,传入NULL是不关心是否有写变化。 $except是$sockets里面要被排除的元素,传入NULL是”监听”全部。 最后一个参数是超时时间 如果为0:则立即结束 如果为n>1: 则最多在n秒后结束,如遇某一个连接有新动态,则提前返回 如果为null:如遇某一个连接有新动态,则返回 */ socket_select($changes,$write,$except,NULL); foreach($changes as $sock){ //如果有新的client连接进来,则 if($sock==$this->master){ //接受一个socket连接 $client=socket_accept($this->master); //给新连接进来的socket一个唯一的ID $key=uniqid(); $this->sockets[]=$client; //将新连接进来的socket存进连接池 $this->users[$key]=array( 'socket'=>$client, //记录新连接进来client的socket信息 'shou'=>false //标志该socket资源没有完成握手 ); //否则1.为client断开socket连接,2.client发送信息 }else{ $len=0; $buffer=''; //读取该socket的信息,注意:第二个参数是引用传参即接收数据,第三个参数是接收数据的长度 do{ $l=socket_recv($sock,$buf,1000,0); $len+=$l; $buffer.=$buf; }while($l==1000); //根据socket在user池里面查找相应的$k,即健ID $k=$this->search($sock); //如果接收的信息长度小于7,则该client的socket为断开连接 if($len<7){ //给该client的socket进行断开操作,并在$this->sockets和$this->users里面进行删除 $this->send2($k); continue; } //判断该socket是否已经握手 if(!$this->users[$k]['shou']){ //如果没有握手,则进行握手处理 $this->woshou($k,$buffer); }else{ //走到这里就是该client发送信息了,对接受到的信息进行uncode处理 $buffer = $this->uncode($buffer,$k); if($buffer==false){ continue; } //如果不为空,则进行消息推送操作 $this->send($k,$buffer); } } } } } ?>
3. サーバー側で WebSocket の準備作業が完了したら、クライアントが接続するのを待ちます。クライアントが WebSocket を作成するのは非常に簡単です。コードは次のとおりです。 PHP プログラミングの入門からマスターまでの一連のチュートリアル
以上がPHPでのWebSocketの使用例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

在PHP中,可以利用implode()函数的第一个参数来设置没有分隔符,该函数的第一个参数用于规定数组元素之间放置的内容,默认是空字符串,也可将第一个参数设置为空,语法为“implode(数组)”或者“implode("",数组)”。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。


ホットAIツール

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

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

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

ドリームウィーバー CS6
ビジュアル Web 開発ツール

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

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

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

AtomエディタMac版ダウンロード
最も人気のあるオープンソースエディター
