小編也是剛接觸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('0.0.0.0',9501); //服務(wù)器配置 $http_server->set( ????[ ????????'enable_static_handler'?=>?true, ????????'document_root'?=>?'/www/wwwroot/test_project/swoole', ????] ); $http_server->on('request',function($request?,$response){ ????//print_r($request->get); ????//設(shè)置響應(yīng)頭信息 ????$response->cookie('xyj','hello',86400); ????//服務(wù)器返回信息 ????$response->end('http_server'?.?json_encode($request->get)); }); $http_server->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'?=>?true, ????????'document_root'?=>?'/www/wwwroot/test_project/swoole', ????] ); //監(jiān)聽(tīng)WebSocket連接打開(kāi)事件 $ws->on('open',?function?($ws,?$request)?{ ????var_dump($request->fd,?$request->get,?$request->server); ????$ws->push($request->fd,?"hello,?welcomen"); }); //監(jiān)聽(tīng)WebSocket消息事件 $ws->on('message',?function?($ws,?$frame)?{ ????echo?"Message:?{$frame->data}n"; ????$ws->push($frame->fd,?"server:?{$frame->data}"); }); //監(jiān)聽(tīng)WebSocket連接關(guān)閉事件 $ws->on('close',?function?($ws,?$fd)?{ ????echo?"client-{$fd}?is?closedn"; }); $ws->start();
ws.html
nbsp;html> ????<meta> ????<meta> ????<meta> ????<title>Document</title><h1>hello?swoole?測(cè)試</h1> <script> var wsServer = 'ws://:9502'; var websocket = new WebSocket(wsServer); websocket.onopen = function (evt) { websocket.send('hello swoole!!!'); console.log("Connected to WebSocket server."); }; websocket.onclose = function (evt) { console.log("Disconnected"); }; websocket.onmessage = function (evt) { console.log('Retrieved data from server: ' + evt.data); }; websocket.onerror = function (evt, e) { console.log('Error occured: ' + 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, 正常情況下是這樣如果遇到錯(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端口如圖
走到這里我們的兩個(gè)服務(wù)器都已經(jīng)開(kāi)啟了 。我們就可以通過(guò)瀏覽器訪問(wèn)了,在瀏覽器上輸入地址:9501 , 此時(shí)這里的端口是要個(gè)http服務(wù)器的端口一致而不是websocket的端口,訪問(wèn)成功會(huì)出現(xiàn)如下圖
這幾條消息 我是這樣理解的,如果有誤歡迎斧正,這個(gè)時(shí)候我們的websocket就算是握手成功了
關(guān)于第二種訪問(wèn)就是 我們只開(kāi)啟ws.php? 在瀏覽器上訪問(wèn)和第一種是一樣的,但是此時(shí)的端口就要變成websocket的端口了,展示頁(yè)面和第一種是一樣的。
關(guān)于鏈接websocket 小編的過(guò)程大致就這樣,如有不對(duì)的地方,歡迎各位大神前來(lái)斧正。