通訊協(xié)議的作用
由于TCP是基于流的,客戶端發(fā)送的請求數(shù)據(jù)是像水流一樣流入到服務端,服務端探測到有數(shù)據(jù)到來后應該檢查數(shù)據(jù)是否是完整的,因為可能只是一個請求的部分數(shù)據(jù)到達服務端,甚至可能是多個請求連在一起到達服務端。如何判斷請求是否全部到達或者從多個連在一起的請求中分離請求,就需要規(guī)定一套通訊協(xié)議。
在Workerman中為什么要制定協(xié)議?
傳統(tǒng)PHP開發(fā)都是基于Web的,基本上都是HTTP協(xié)議,HTTP協(xié)議的解析處理都由WebServer獨自承擔了,所以開發(fā)者不會關心協(xié)議方面的事情。然而當我們需要基于非HTTP協(xié)議開發(fā)時,開發(fā)者就需要考慮協(xié)議的事情了。
Workerman已經(jīng)支持的協(xié)議
Workerman目前已經(jīng)支持HTTP、websocket、text協(xié)議(見附錄說明)、frame協(xié)議(見附錄說明),ws協(xié)議(見附錄說明),需要基于這些協(xié)議通訊時可以直接使用,使用方法為:在初始化Worker時指定協(xié)議,例如
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';
// websocket://0.0.0.0:2345 表明用websocket協(xié)議監(jiān)聽2345端口
$websocket_worker = new Worker('websocket://0.0.0.0:2345');
// text協(xié)議
$text_worker = new Worker('text://0.0.0.0:2346');
// frame協(xié)議
$frame_worker = new Worker('frame://0.0.0.0:2347');
// tcp Worker,直接基于socket傳輸,不使用任何應用層協(xié)議
$tcp_worker = new Worker('tcp://0.0.0.0:2348');
// udp Worker,不使用任何應用層協(xié)議
$udp_worker = new Worker('udp://0.0.0.0:2349');
// unix domain Worker,不使用任何應用層協(xié)議
$unix_worker = new Worker('unix:///tmp/wm.sock');
使用自定義的通訊協(xié)議
當Workerman自帶的通訊協(xié)議滿足不了開發(fā)需求時,開發(fā)者可以定制自己的通訊協(xié)議,定制方法見下一節(jié)內(nèi)容。
提示:
Workerman內(nèi)置了一個text協(xié)議,協(xié)議格式為文本+換行符。text協(xié)議開發(fā)調(diào)試都非常簡單,可用于絕大多數(shù)自定義協(xié)議的場景,并且支持telnet調(diào)試。如果開發(fā)者要開發(fā)自己的應用協(xié)議,可以直接使用text協(xié)議,不用再單獨開發(fā)。
text協(xié)議說明參考《附錄 Text協(xié)議部分》