展示swoole 的websocket 連接

展示swoole 的websocket 連接

小編也是剛接觸swoole,官方文檔給swoole demo信息量也非常的少,有些地方也沒(méi)有說(shuō)清楚,折騰了一,兩天websocket終于握手成功,寫(xiě)下我的心得,希望能給有需要的人一些幫助。

首先我先介紹我的運(yùn)行環(huán)境是直接放在外網(wǎng)服務(wù)器的,程序運(yùn)行環(huán)境我就不多說(shuō)了大家可以參考swoole官網(wǎng),我是直接通過(guò)ip 進(jìn)行訪問(wèn)的,在這其中小編遇到一個(gè)坑,那就是我們讓htpp服務(wù)器或者websocket監(jiān)聽(tīng)的端口 必須要到服務(wù)器上開(kāi)放,小編的阿里云服務(wù)器要到安全組里面去設(shè)置放行端口,出入方向都要設(shè)置。否則你會(huì)發(fā)現(xiàn)你通過(guò)ip:端口 是無(wú)法訪問(wèn)服務(wù)器的

推薦(免費(fèi)):swoole

在這里我介紹下兩種連接websocket服務(wù)器的方法

1、通過(guò)訪問(wèn)http服務(wù)器然后訪問(wèn)我們的html頁(yè)面連接我們的websouket服務(wù)器,這樣我們就需要3個(gè)文件。1 http.php? 2 ws.php 3 ws.html 簡(jiǎn)單貼下我的圖,也是參考官方文檔寫(xiě)的

http.php

<?php /**  * Created by PhpStorm.  * User: xyj  * Date: 18-9-9  * Time: 下午4:31  */  //實(shí)例化 $http_server = new swoole_http_server(&#39;0.0.0.0&#39;,9501);  //服務(wù)器配置 $http_server->set( ????[ ????????'enable_static_handler'?=&gt;?true, ????????'document_root'?=&gt;?'/www/wwwroot/test_project/swoole', ????] );  $http_server-&gt;on('request',function($request?,$response){ ????//print_r($request-&gt;get); ????//設(shè)置響應(yīng)頭信息 ????$response-&gt;cookie('xyj','hello',86400); ????//服務(wù)器返回信息 ????$response-&gt;end('http_server'?.?json_encode($request-&gt;get)); });  $http_server-&gt;start();

ws.php

<?php /**  * Created by PhpStorm.  * User: xyj  * Date: 18-9-9  * Time: 下午5:02  */  //創(chuàng)建websocket服務(wù)器對(duì)象,監(jiān)聽(tīng)0.0.0.0:9502端口 $ws = new swoole_websocket_server("0.0.0.0", 9502);  $ws->set( ????[ ????????'enable_static_handler'?=&gt;?true, ????????'document_root'?=&gt;?'/www/wwwroot/test_project/swoole', ????] ); //監(jiān)聽(tīng)WebSocket連接打開(kāi)事件 $ws-&gt;on('open',?function?($ws,?$request)?{ ????var_dump($request-&gt;fd,?$request-&gt;get,?$request-&gt;server); ????$ws-&gt;push($request-&gt;fd,?"hello,?welcomen"); });  //監(jiān)聽(tīng)WebSocket消息事件 $ws-&gt;on('message',?function?($ws,?$frame)?{ ????echo?"Message:?{$frame-&gt;data}n"; ????$ws-&gt;push($frame-&gt;fd,?"server:?{$frame-&gt;data}"); });  //監(jiān)聽(tīng)WebSocket連接關(guān)閉事件 $ws-&gt;on('close',?function?($ws,?$fd)?{ ????echo?"client-{$fd}?is?closedn"; });  $ws-&gt;start();

ws.html

nbsp;html&gt;   ????<meta> ????<meta> ????<meta> ????<title>Document</title><h1>hello?swoole?測(cè)試</h1>    <script>     var wsServer = &#39;ws://:9502&#39;;     var websocket = new WebSocket(wsServer);     websocket.onopen = function (evt) {         websocket.send(&#39;hello swoole!!!&#39;);         console.log("Connected to WebSocket server.");     };      websocket.onclose = function (evt) {         console.log("Disconnected");     };      websocket.onmessage = function (evt) {         console.log(&#39;Retrieved data from server: &#39; + evt.data);     };      websocket.onerror = function (evt, e) {         console.log(&#39;Error occured: &#39; + evt.data);     }; </script>

如果是在本地測(cè)試環(huán)境運(yùn)行那么wsServer = ‘ws://127.0.0.1:9502’,如果是外網(wǎng) 那么127.0.0.1 就要改成你瀏覽器上所訪問(wèn)的地址,這里的端口必須要和你websocket 服務(wù)器端口一致否則無(wú)法訪問(wèn)的

準(zhǔn)備工作做好了那么我們就開(kāi)始訪問(wèn)下websocket,首先在終端 運(yùn)行http.php 和 ws.php, 正常情況下是這樣展示swoole 的websocket 連接如果遇到錯(cuò)誤一般常見(jiàn)的就是端口被占用,如果是swoole擴(kuò)展沒(méi)裝好或者是語(yǔ)法錯(cuò)誤,那么請(qǐng)?jiān)谧屑?xì)的讀啃下官方文檔。

如果是端口被占用我們可以使用 lsof -i:9501 命令查看 端口信息, 在kill之前請(qǐng)先認(rèn)真的看下 該端口是否是重要端口,不要盲目的kill 。

還有一種就是我們開(kāi)啟過(guò)http.php 在關(guān)閉后 可能被占用的端口沒(méi)有及時(shí)的釋放,當(dāng)我們?cè)俅蝡hp http.php的時(shí)候他也會(huì)拋出端口被占用的錯(cuò)誤,這里我們可以用 這個(gè)命令 netstat -ntlp 來(lái)查看tcp監(jiān)聽(tīng)的端口,其父進(jìn)程 kill 然后在運(yùn)行就ok了,繼續(xù)使用這個(gè)命令來(lái)查看tcp端口如圖

展示swoole 的websocket 連接

走到這里我們的兩個(gè)服務(wù)器都已經(jīng)開(kāi)啟了 。我們就可以通過(guò)瀏覽器訪問(wèn)了,在瀏覽器上輸入地址:9501 , 此時(shí)這里的端口是要個(gè)http服務(wù)器的端口一致而不是websocket的端口,訪問(wèn)成功會(huì)出現(xiàn)如下圖

展示swoole 的websocket 連接

這幾條消息 我是這樣理解的,如果有誤歡迎斧正,這個(gè)時(shí)候我們的websocket就算是握手成功了

關(guān)于第二種訪問(wèn)就是 我們只開(kāi)啟ws.php? 在瀏覽器上訪問(wèn)和第一種是一樣的,但是此時(shí)的端口就要變成websocket的端口了,展示頁(yè)面和第一種是一樣的。

關(guān)于鏈接websocket 小編的過(guò)程大致就這樣,如有不對(duì)的地方,歡迎各位大神前來(lái)斧正。

以上就是展示

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊15 分享