看了workerman手冊(cè)的這個(gè)章節(jié)
定制通訊協(xié)議
http://doc3.workerman.net/protocols/how-protocols.html
以文中MyApp/Protocols/JsonNL.php的實(shí)現(xiàn),
放在gatewayworker中,是不是在GatewayWorker\Applications\下新建Protocols文件夾,然后建立JsonNL.php,這樣是不是項(xiàng)目名稱變成了Protocols,還是在具體在Applications\xxx項(xiàng)目\下建立Protocols?
GatewayWorker使用workerman自定義協(xié)議,應(yīng)該把自定義的協(xié)議文件放在哪個(gè)目錄呢?謝謝
----------------------- WORKERMAN -----------------------------
Workerman version:3.2.5 PHP version:5.5.15
------------------------ WORKERS -------------------------------
worker listen processes status
Register text://0.0.0.0:1238 1
SolarGateway JsonNL://0.0.0.0:8282 4
SolarBusinessWorker none 4
----------------------------------------------------------------
Press Ctrl-C to quit. Start success.
Fatal error: Uncaught exception 'Exception' with message 'class \Protocols\JsonN
L not exist' in D:\workerman\GatewayWorker\Workerman\Worker.php:649
Stack trace:
#0 D:\workerman\GatewayWorker\Workerman\Worker.php(426): Workerman\Worker->liste
n()
#1 D:\workerman\GatewayWorker\Workerman\Worker.php(345): Workerman\Worker::runAl
lWorkers()
#2 D:\workerman\GatewayWorker\Applications\Solar\start_gateway.php(64): Workerma
n\Worker::runAll()
#3 {main}
thrown in D:\workerman\GatewayWorker\Workerman\Worker.php on line 649
process D:\workerman\GatewayWorker\Applications\Solar\start_gateway.php terminat
ed and try to restart
gatewayworker下載github的最新版本
目錄結(jié)構(gòu)
.
├── Applications // 這里是所有開發(fā)者應(yīng)用項(xiàng)目
│ └── Solar // 自定義項(xiàng)目
│ ├── Event.php // 開發(fā)者只需要關(guān)注這個(gè)文件
│ ├── start_gateway.php // gateway進(jìn)程啟動(dòng)腳本
│ ├── start_businessworker.php // businessWorker進(jìn)程啟動(dòng)腳本
│ └── start_register.php // 注冊(cè)服務(wù)啟動(dòng)腳本
│ ├── Protocols
│ └──JsonNL.php //粘貼自手冊(cè)
├── GatewayWorker // GatewayWorker框架代碼
│ ├── BusinessWorker.php // BusinessWorker進(jìn)程實(shí)現(xiàn)
│ ├── Gateway.php // Gateway進(jìn)程實(shí)現(xiàn)
│ ├── Register.php // 注冊(cè)服務(wù)進(jìn)程實(shí)現(xiàn)
│ ├── Lib
│ │ ├── Context.php // Gateway與BusinessWorker通信上下文
│ │ ├── DbConnection.php// 一個(gè)數(shù)據(jù)庫連接類
│ │ ├── Db.php // 數(shù)據(jù)庫連接管理類
│ │ └── Gateway.php // Gateway通信接口類,給Event.php調(diào)用
│ └──── Protocols
│ └── GatewayProtocol.php // Gateway與BusinessWorker通信協(xié)議
│
├── Workerman // workerman內(nèi)核目錄
│
└── start.php // 全局啟動(dòng)腳本
JsonNL.php代碼
namespace Protocols;
class JsonNL
{
/**
* 檢查包的完整性
* 如果能夠得到包長,則返回包的在buffer中的長度,否則返回0繼續(xù)等待數(shù)據(jù)
* 如果協(xié)議有問題,則可以返回false,當(dāng)前客戶端連接會(huì)因此斷開
* @param string $buffer
* @return int
*/
public static function input($buffer)
{
// 獲得換行字符"\n"位置
$pos = strpos($buffer, "\n");
// 沒有換行符,無法得知包長,返回0繼續(xù)等待數(shù)據(jù)
if($pos === false)
{
return 0;
}
// 有換行符,返回當(dāng)前包長(包含換行符)
return $pos+1;
}
/**
* 打包,當(dāng)向客戶端發(fā)送數(shù)據(jù)的時(shí)候會(huì)自動(dòng)調(diào)用
* @param string $buffer
* @return string
*/
public static function encode($buffer)
{
// json序列化,并加上換行符作為請(qǐng)求結(jié)束的標(biāo)記
return json_encode($buffer)."\n";
}
/**
* 解包,當(dāng)接收到的數(shù)據(jù)字節(jié)數(shù)等于input返回的值(大于0的值)自動(dòng)調(diào)用
* 并傳遞給onMessage回調(diào)函數(shù)的$data參數(shù)
* @param string $buffer
* @return string
*/
public static function decode($buffer)
{
// 去掉換行,還原成數(shù)組
return json_decode(trim($buffer), true);
}
}
//windows下測(cè)試最后修改了Applications \Solar\start_gateway.php
$gateway = new Gateway("JsonNL://0.0.0.0:8282");
├── Applications // 這里是所有開發(fā)者應(yīng)用項(xiàng)目
│ └── Solar // 自定義項(xiàng)目
│ ├── Event.php // 開發(fā)者只需要關(guān)注這個(gè)文件
│ ├── start_gateway.php // gateway進(jìn)程啟動(dòng)腳本
│ ├── start_businessworker.php // businessWorker進(jìn)程啟動(dòng)腳本
│ └── start_register.php // 注冊(cè)服務(wù)啟動(dòng)腳本
│ ├── Protocols
│ └──JsonNL.php //粘貼自手冊(cè)
你的目錄結(jié)構(gòu)看著 JsonNL.php 和 Protocols 目錄是平行的,JsonNL.php并沒有在Protocols目錄下
我粘貼上顯示的有些問題
├── Applications // 這里是所有開發(fā)者應(yīng)用項(xiàng)目
│ └── Solar // 自定義項(xiàng)目
│ ├── Event.php // 開發(fā)者只需要關(guān)注這個(gè)文件
│ ├── start_gateway.php // gateway進(jìn)程啟動(dòng)腳本
│ ├── start_businessworker.php // businessWorker進(jìn)程啟動(dòng)腳本
│ └── start_register.php // 注冊(cè)服務(wù)啟動(dòng)腳本
│ ├── Protocols
│ └──JsonNL.php //粘貼自手冊(cè)