text協議

Workerman 定義了一種稱為 text 的文本協議,協議格式為 數據包+換行符,即在每個數據包末尾加上一個換行符表示包的結束。

例如下面的 buffer1 和 buffer2 字串符合 text 協議:

// 文本加一个回车
$buffer1 = 'abcdefghijklmn
';
// 在php中雙引號中的\n代表一個換行符,例如"\n"
$buffer2 = '{"type":"say", "content":"hello"}'."\n";

// 與服務端建立 socket 連接
$client = stream_socket_client('tcp://127.0.0.1:5678');
// 以 text 協議發送 buffer1 數據
fwrite($client, $buffer1);
// 以 text 協議發送 buffer2 數據
fwrite($client, $buffer2);

text 協議非常簡單易用,如果開發者需要一個屬於自己的協議,例如與手機 App 傳輸數據或者與硬件通訊等等,可以考慮使用 text 協議,開發調試都非常方便。

text 協議調試

text 協議可以使用 telnet 客戶端調試,例如下面的例子:

新建文件 test.php

require_once __DIR__ . '/Workerman/Autoloader.php';
use Workerman\Worker;

$text_worker = new Worker("text://0.0.0.0:5678");

$text_worker->onMessage =  function($connection, $data)
{
    var_dump($data);
    $connection->send("hello world");
};

Worker::runAll();

執行php test.php start顯示如下

php test.php start
Workerman[test.php] start in DEBUG mode
----------------------- WORKERMAN -----------------------------
Workerman version:3.2.7          PHP version:5.4.37
------------------------ WORKERS -------------------------------
user          worker        listen                         processes status
root          none          myTextProtocol://0.0.0.0:5678   1         [OK]
----------------------------------------------------------------
Press Ctrl-C to quit. Start success.

重新打開一個終端,利用 telnet 測試(建議用 Linux 系統的 telnet)

假設是本機測試,
終端執行 telnet 127.0.0.1 5678
然後輸入 hi 回車
會接收到數據 hello world\n

telnet 127.0.0.1 5678
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
hi
hello world