亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 語言 > PHP > 正文

php實現socket推送技術的示例

2024-05-05 00:01:33
字體:
來源:轉載
供稿:網友

在socket出現之前已經有ajax定時請求、長輪詢等方案,但都不能滿足需求,socket就應用而生了。

socket基本函數socket

總結下常用的socket函數

服務端: socket_create 創建socket設置基本參數

     socket_bind 綁定ip和端口號

     socket_listen 監聽

     socket_accept 客戶端的連接

     socket_read 讀取客戶端的數據

     socket_write 給單獨客戶端發送數據

     socket_close 關閉連接

客戶端:socket_create 創建socket設置基本參數

     socket_connect 連接socket

     socket_write 給服務端發送數據

     socket_read 讀取服務端數據

     socket_close 關閉連接

H5websocket不多說了,上鏈接

OK,開始貼代碼~

----------------------------------------------------------分割線

服務端代碼:

<?phpclass WS { var $master; var $sockets = array(); var $debug = false;//true為調試模式,輸出log日志 var $handshake = array(); function __construct($address, $port){ $this->master=socket_create(AF_INET, SOCK_STREAM, SOL_TCP) or die("socket_create() failed"); socket_set_option($this->master, SOL_SOCKET, SO_REUSEADDR, 1) or die("socket_option() failed"); socket_bind($this->master, $address, $port)  or die("socket_bind() failed"); socket_listen($this->master,20)  or die("socket_listen() failed");  $this->sockets[] = $this->master; $this->say("Server Started : ".date('Y-m-d H:i:s')); $this->say("Listening on : ".$address." port ".$port); $this->say("Master socket : ".$this->master."/n");  while(true){ $socketArr = $this->sockets; $write = NULL; $except = NULL; socket_select($socketArr, $write, $except, NULL); //自動選擇來消息的socket 如果是握手 自動選擇主機 foreach ($socketArr as $socket){ if ($socket == $this->master){ //主機  $client = socket_accept($this->master);  if ($client < 0){  $this->log("socket_accept() failed");  continue;  } else{  $this->connect($client);  } } else {  $bytes = @socket_recv($socket,$buffer,2048,0);  if ($bytes == 0){  $this->disConnect($socket);  }  else{  $key = array_search($socket, $this->sockets);  if (empty($this->handshake) || !isset($this->handshake[$key]) || !$this->handshake[$key]){  $this->doHandShake($socket, $buffer, $key);  }  else{  $buffer = $this->decode($buffer);  echo $buffer.PHP_EOL;  $key = array_search($socket, $this->sockets);  $arr = $this->sockets;  array_shift($arr);  foreach ($arr as $s){  $this->send($s, $buffer);  }  }  } } } } }  function send($client, $msg){ $msg = $this->frame($msg); socket_write($client, $msg, strlen($msg)); } function connect($socket){ array_push($this->sockets, $socket); $this->say("/n" . $socket . " CONNECTED!"); $this->say(date("Y-n-d H:i:s")); } function disConnect($socket){ $index = array_search($socket, $this->sockets); socket_close($socket); $this->say($socket . " DISCONNECTED!"); if ($index >= 0){ echo 'unset index is:'.PHP_EOL; unset($this->sockets[$index]); } } function doHandShake($socket, $buffer, $handKey){ $this->log("/nRequesting handshake..."); $this->log($buffer); list($resource, $host, $origin, $key) = $this->getHeaders($buffer); $this->log("Handshaking..."); $upgrade = "HTTP/1.1 101 Switching Protocol/r/n" .  "Upgrade: websocket/r/n" .  "Connection: Upgrade/r/n" .  "Sec-WebSocket-Accept: " . $this->calcKey($key) . "/r/n/r/n"; //必須以兩個回車結尾 $this->log($upgrade); $sent = socket_write($socket, $upgrade, strlen($upgrade)); $this->handshake[$handKey]=true; $this->log("Done handshaking..."); return true; } function getHeaders($req){ $r = $h = $o = $key = null; if (preg_match("/GET (.*) HTTP/" ,$req,$match)) { $r = $match[1]; } if (preg_match("/Host: (.*)/r/n/" ,$req,$match)) { $h = $match[1]; } if (preg_match("/Origin: (.*)/r/n/" ,$req,$match)) { $o = $match[1]; } if (preg_match("/Sec-WebSocket-Key: (.*)/r/n/",$req,$match)) { $key = $match[1]; } return array($r, $h, $o, $key); } function calcKey($key){ //基于websocket version 13 $accept = base64_encode(sha1($key . '258EAFA5-E914-47DA-95CA-C5AB0DC85B11', true)); return $accept; } function decode($buffer) { $len = $masks = $data = $decoded = null; $len = ord($buffer[1]) & 127; if ($len === 126) { $masks = substr($buffer, 4, 4); $data = substr($buffer, 8); }  else if ($len === 127) { $masks = substr($buffer, 10, 4); $data = substr($buffer, 14); }  else { $masks = substr($buffer, 2, 4); $data = substr($buffer, 6); } for ($index = 0; $index < strlen($data); $index++) { $decoded .= $data[$index] ^ $masks[$index % 4]; } return $decoded; } function frame($s){ $a = str_split($s, 125); if (count($a) == 1){ return "/x81" . chr(strlen($a[0])) . $a[0]; } $ns = ""; foreach ($a as $o){ $ns .= "/x81" . chr(strlen($o)) . $o; } return $ns; }  function say($msg = ""){ echo $msg . "/n"; } function log($msg = ""){ if ($this->debug){ echo $msg . "/n"; }  }} new WS('localhost', 4000);

客戶端代碼(H5):

<html> <head> <title>demo</title> <script src="https://cdn.bootcss.com/jquery/1.9.1/jquery.min.js"></script> </head> <body> <input type="text" id="content"> <input type="button" value="send" id="send"> <script type="text/javascript">  var ws = new WebSocket("ws://localhost:4000");  ws.onopen = function(){  console.log("握手成功");  }  ws.onmessage = function(e){  console.log("message:" + e.data);  }  ws.onerror = function(){  console.log("error");  }  $("#send").click(function(){  content = $("#content").val();  console.log(content);  ws.send(content);  }) </script> </body></html>

然后執行php demo.php 開啟socket(從運維那偷學一招,linux下執行nohup php demo.php &可以在后臺執行),瀏覽器打開多個index.html,就能建立通訊了。

代碼解析:

1.屬性$sockets數組保存每個accept連接(不知道這么描述對不對);

2.屬性$handshake數組保存連接是否在連接狀態;

以上這篇php實現socket推送技術的示例就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到PHP教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
亚洲直播在线一区| 久久不射热爱视频精品| 亚洲自拍小视频| 最新亚洲国产精品| 国产精品久久久久久亚洲影视| 色噜噜狠狠狠综合曰曰曰88av| 欧美日本高清视频| 91免费人成网站在线观看18| 欧美成aaa人片在线观看蜜臀| 日韩一区二区三区xxxx| 亚洲精选中文字幕| 日本精品免费观看| 精品高清美女精品国产区| 91成人福利在线| 91热精品视频| 高跟丝袜一区二区三区| 在线观看国产精品日韩av| 亚洲aa在线观看| 国产日韩欧美另类| 久久久久久97| 久久偷看各类女兵18女厕嘘嘘| 精品亚洲一区二区三区四区五区| 成年人精品视频| 91精品久久久久久久久中文字幕| 亚洲成人黄色网址| 欧美午夜宅男影院在线观看| 欧美在线欧美在线| 色妞色视频一区二区三区四区| 国产精品久久久久久超碰| 欧美成人免费va影院高清| 欧美一级片久久久久久久| 久久亚洲一区二区三区四区五区高| 国产日本欧美一区二区三区| 中文字幕欧美专区| 亚洲成人亚洲激情| 中文字幕日韩av综合精品| 日韩中文字幕国产精品| 欧美日韩国产黄| 久久综合久中文字幕青草| 日韩中文字幕在线观看| 久久视频在线播放| 57pao精品| 欧美精品电影免费在线观看| 亚洲男人天堂古典| 欧美精品videossex性护士| 日韩精品免费视频| 久久久久久久激情视频| 久久精品久久久久久国产 免费| 91av在线不卡| 人人做人人澡人人爽欧美| 欧美亚洲国产视频| 丝袜亚洲欧美日韩综合| 91在线|亚洲| 少妇高潮久久久久久潘金莲| 成人h片在线播放免费网站| 爽爽爽爽爽爽爽成人免费观看| 亚洲第一视频网站| 成人黄色在线观看| 中文字幕日韩欧美精品在线观看| 国产一区二区三区高清在线观看| 欧美野外猛男的大粗鳮| 亚州精品天堂中文字幕| 91成人在线播放| 中文字幕成人在线| 国产精品视频一区二区三区四| 久久久这里只有精品视频| 精品国产视频在线| 成人免费网站在线| 亚洲视频国产视频| 国产99久久精品一区二区 夜夜躁日日躁| 亚洲精品福利在线| 91精品免费看| 国产精品久久久久久久午夜| 国产精品视频精品视频| 久久成人在线视频| 亚洲少妇激情视频| 97香蕉超级碰碰久久免费软件| 亚洲国产又黄又爽女人高潮的| 色综合久久中文字幕综合网小说| 欧美一级大片在线免费观看| 亚洲少妇激情视频| 国自在线精品视频| 亚洲欧美中文日韩在线v日本| 久久精品91久久香蕉加勒比| 日韩一区二区三区xxxx| 国产精欧美一区二区三区| 国产一区二区三区在线看| 疯狂做受xxxx欧美肥白少妇| 色与欲影视天天看综合网| 亚洲乱码国产乱码精品精天堂| 国产精品久久久久久久一区探花| 国产日本欧美视频| 色综合久久精品亚洲国产| 亚洲国产天堂久久国产91| 国产精品视频免费观看www| 欧美电影在线观看网站| 在线色欧美三级视频| 欧美激情性做爰免费视频| 欧美国产日韩一区二区在线观看| 国内精品久久久久久中文字幕| 欧美电影免费观看网站| 国产精品旅馆在线| 亚洲一区制服诱惑| 亚洲精品免费一区二区三区| 成人在线视频网站| 欧美黑人巨大xxx极品| 亚洲综合最新在线| 国内自拍欧美激情| 在线观看日韩视频| 秋霞av国产精品一区| 中文字幕欧美日韩精品| 日韩美女在线观看一区| 欧美亚洲国产成人精品| 国产视频999| 亚洲人成免费电影| 色哟哟入口国产精品| 亚洲一区久久久| 国产日韩视频在线观看| 亚洲欧美日韩国产精品| 国产69精品久久久久9| 色小说视频一区| 黄色成人在线免费| 清纯唯美亚洲激情| 日韩av成人在线观看| 成人春色激情网| 精品亚洲一区二区三区四区五区| 国产日韩欧美自拍| 国产在线98福利播放视频| 午夜精品一区二区三区在线播放| 九九九久久久久久| 在线播放日韩av| 青青青国产精品一区二区| 欧美成人午夜激情| 国产精品99久久久久久久久久久久| 亚洲娇小xxxx欧美娇小| 久久久综合av| 最近2019中文字幕mv免费看| 国产精品吹潮在线观看| 亚洲欧美国产制服动漫| 亚洲精品av在线播放| 国产亚洲欧美日韩精品| 日韩美女毛茸茸| 日av在线播放中文不卡| 欧美激情综合亚洲一二区| 亚洲人线精品午夜| 成人国产精品色哟哟| 欧美日韩在线免费| 日本欧美中文字幕| 亚洲精品乱码久久久久久按摩观| 欧美在线视频在线播放完整版免费观看| 欧美韩日一区二区| 亚洲精品视频中文字幕| 成人网中文字幕| 最近更新的2019中文字幕| 中文字幕日韩精品在线| 亚洲国产女人aaa毛片在线| 欧美成人免费在线观看| 久久精品国产96久久久香蕉| 97国产在线视频| 不卡av在线播放| 亚洲国产精品资源| 国产成人综合一区二区三区| 亚洲黄色av女优在线观看| 精品国偷自产在线视频|