多協(xié)議支持
需求
有時我們需要一套應用程序支持多個客戶端,進而需要應用支持多個協(xié)議。例如一個IM即時通訊應用,可能需要同時支持瀏覽器使用,又要支持移動App客戶端。而二者所使用的協(xié)議可能完全不同。
如何支持多協(xié)議
在WorkerMan中最簡單的實現(xiàn)方法是開啟多個端口,每個端口使用一種協(xié)議。不同客戶端使用各自的協(xié)議去連特定的端口。
示例(小蝌蚪)
小蝌蚪應用程序是運行在PC瀏覽器里面的,使用Websocket協(xié)議與WorkerMan通訊,當我們需要把它移植到手機App上卻沒有合適的客戶端Websocket庫時,我們可以使用更簡單的協(xié)議來實現(xiàn)App與WorkerMan通訊,例如Text文本協(xié)議(協(xié)議規(guī)則為 文本+換行符)。
下面是開啟多端口支持多協(xié)議示例
創(chuàng)建新文件 Applications/Todpole/start_text_gateway.php
use \Workerman\Worker;
use \GatewayWorker\Gateway;
// 自動加載類
require_once __DIR__ . '/../../Workerman/Autoloader.php';
// ##########新增端口支持Text協(xié)議 開始##########
// 新增8283端口,開啟Text文本協(xié)議
$gateway_text = new Gateway("Text://0.0.0.0:8283");
// 進程名稱,主要是status時方便識別
$gateway_text->name = 'TodpoleGatewayText';
// 開啟多少text協(xié)議的gateway進程
$gateway_text->count = 4;
// 本機ip(分布式部署時需要設置成內網ip)
$gateway_text->lanIp = '127.0.0.1';
// 設置服務注冊地址(注意:這個地址是start_register.php中監(jiān)聽的地址)
$gateway_text->registerAddress = '127.0.0.1:1237';
// gateway內部通訊起始端口,起始端口不要重復
$gateway_text->startPort = 2500;
// 也可以設置心跳,這里省略
// ##########新增端口支持Text協(xié)議 結束##########
if(!defined('GLOBAL_START'))
{
Worker::runAll();
}
重新啟動
測試效果
由于是Text文本協(xié)議,我們可以通過telnet命令方便的模擬文本協(xié)議客戶端。以下運行telnet命令的結果
telnet 127.0.0.1 8283
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
{"type":"update","id":156,"angle":3.636,"momentum":0,"x":-64.8,"y":147.1,"life":1,"name":"Guest.156","authorized":false}
{"type":"update","id":156,"angle":4.27,"momentum":0,"x":-64.8,"y":147.1,"life":1,"name":"Guest.156","authorized":false}
{"type":"update","id":156,"angle":5.766,"momentum":0,"x":-64.8,"y":147.1,"life":1,"name":"Guest.156","authorized":false}
{"type":"update","id":156,"angle":6.284,"momentum":3,"x":-58.8,"y":146.7,"life":1,"name":"Guest.156","authorized":false}
我們能看到其它PC客戶端通過WorkerMan轉發(fā)來的蝌蚪的實時坐標數(shù)據(jù),我們也可以輸入自己的坐標數(shù)據(jù),然后按回車鍵,我們就能在小蝌蚪界面上看到自己了。這樣通過使用telnet客戶端+文本協(xié)議,我們可以方便的調試數(shù)據(jù),開發(fā)新的客戶端了。
說明:
以上是WorkerMan多協(xié)議支持示例,我們看到只需要簡單的初始化端口及協(xié)議即可,服務端的業(yè)務代碼不用任何更改。開發(fā)者也可以使用其它協(xié)議初始化端口,也可以參考《定制通訊協(xié)議章節(jié)》定義自己的協(xié)議
以上是Gateway/Worker模型的多協(xié)議支持示例,基于Worker的多協(xié)議也是同樣的道理
支持多協(xié)議還有其他的方法,比如通過協(xié)議自身的特點區(qū)分當前是哪種協(xié)議,然后分別調用相應協(xié)議的解碼方法,這樣可以做到只開一個端口就可以支持多種協(xié)議的效果