workerman如何創(chuàng)建一個wss服務(wù),使得客戶端可以用過wss協(xié)來連接通訊,比如在微信小程序中連接服務(wù)端。
答:
wss協(xié)議實際是websocket+SSL,就是在websocket協(xié)議上加入SSL層,類似https(http+SSL)。
所以只需要在websocket協(xié)議的基礎(chǔ)上開啟SSL即可支持wss協(xié)議。 ? ? ? ?(推薦學(xué)習(xí): workerman教程)
直接用Workerman開啟SSL
準(zhǔn)備工作:
1、Workerman版本不小于3.3.7
2、PHP安裝了openssl擴(kuò)展
3、已經(jīng)申請了證書(pem/crt文件及key文件)放在磁盤任意目錄
代碼:
<?php require_once __DIR__ . '/Workerman/Autoloader.php'; use WorkermanWorker; // 證書最好是申請的證書 $context = array( // 更多ssl選項請參考手冊 http://php.net/manual/zh/context.ssl.php 'ssl' =>?array( ????????//?請使用絕對路徑 ????????'local_cert'?????????????????=>?'磁盤路徑/server.pem',?//?也可以是crt文件 ????????'local_pk'???????????????????=>?'磁盤路徑/server.key', ????????'verify_peer'????????????????=>?false, ????????//?'allow_self_signed'?=>?true,?//如果是自簽名證書需要開啟此選項 ????) ); //?這里設(shè)置的是websocket協(xié)議(端口任意,但是需要保證沒被其它程序占用) $worker?=?new?Worker('websocket://0.0.0.0:443',?$context); //?設(shè)置transport開啟ssl,websocket+ssl即wss $worker->transport?=?'ssl'; $worker->onMessage?=?function($con,?$msg)?{ ????$con->send('ok'); }; Worker::runAll();
通過以上的代碼,Workerman就監(jiān)聽了wss協(xié)議,客戶端就可以通過wss協(xié)議來連接workerman實現(xiàn)安全即時通訊了。
測試
打開chrome瀏覽器,按F12打開調(diào)試控制臺,在Console一欄輸入(或者把下面代碼放入到html頁面用js運行)
//?證書是會檢查域名的,請使用域名連接 ws?=?new?WebSocket("wss://域名"); ws.onopen?=?function()?{ ????alert("連接成功"); ????ws.send('tom'); ????alert("給服務(wù)端發(fā)送一個字符串:tom"); }; ????ws.onmessage?=?function(e)?{ ????alert("收到服務(wù)端的消息:"?+?e.data); ????};
注意:
1、如果無法啟動,則一般是443端口被占用,請改成其它端口,注意改成其它端口后客戶端連接時需要帶上端口號,客戶端連接時地址類似wss://domain.com:xxx ,xxx為端口號。如果必須使用443端口請使用方法二代理的方式實現(xiàn)wss。
2、wss端口只能通過wss協(xié)議訪問,ws無法訪問wss端口。
3、證書一般是與域名綁定的,所以測試的時候客戶端請使用域名連接,不要使用ip去連。
4、如果出現(xiàn)無法訪問的情況,請檢查服務(wù)器防火墻。
5、此方法要求PHP版本>=5.6,因為微信小程序要求tls1.2,而PHP5.6以下版本不支持tls1.2。