国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

workerman的二進(jìn)制怎么玩啊,怎么封包,怎么解包啊

hanfeng
6478 1 2
1個(gè)回答

walkor 打賞

workerman只管傳輸數(shù)據(jù),傳輸?shù)木唧w協(xié)議或者格式workerman并不關(guān)心,workerman統(tǒng)一當(dāng)做連續(xù)的字節(jié)流處理。

所以workerman不區(qū)分傳輸?shù)氖嵌M(jìn)制還是非二進(jìn)制,只有應(yīng)用開發(fā)者才需要關(guān)心具體傳輸?shù)臄?shù)據(jù)是什么。

php中二進(jìn)制一般采用pack打包,unpack解包。打包解包的內(nèi)容一般只限于數(shù)字類型,字符串是不用打包的,可以直接傳遞。

發(fā)一個(gè)workerman中統(tǒng)計(jì)模塊二進(jìn)制打包的例子:

這個(gè)是包的結(jié)構(gòu)體

 struct statisticPortocol
 {
      unsigned char module_name_len; //模塊名長度
      unsigned char interface_name_len;// 接口名長度
      float cost_time;                                // 本次接口耗時(shí)
      unsigned char success;                   // 本次接口調(diào)用是否成功
      int code;                                           // 返回碼
      unsigned short msg_len;                  // 錯誤信息長度
      unsigned int time;                             // 時(shí)間戳
      char module_name; // 具體的模塊名
      char interface_name; // 具體的接口名
      char msg;                                     // 具體的錯誤信息
 }

// PHP中打包
$module = ‘User’; 
$interface = 'getInfo';
$cost_time = 0.001;
$success = 0;
$code = 500;
$msg = '數(shù)據(jù)庫無法連接';
$module_name_length = strlen($module);
$interface_name_length = strlen($interface);
// 打包,只有數(shù)字類的才需要pack打包,字符串直接拼接即可
$bin_data = pack('CCfCNnN', $module_name_length, $interface_name_length, $cost_time, $success ? 1 : 0, $code, strlen($msg), time()).$module.$interface.$msg

// PHP中解包
$data = unpack("Cmodule_name_len/Cinterface_name_len/fcost_time/Csuccess/Ncode/nmsg_len/Ntime", $bin_data);
// 17是statisticPortocol前8個(gè)字段的固定占用字節(jié)長度
$module = substr($bin_data, 17, $data);
$interface = substr($bin_data, 17 + $data, $data);
$msg = substr($bin_data, 17 + $data + $data);
$data = array(
                'module'          => $module,
                'interface'        => $interface,
                'cost_time'       => $data,
                'success'         => $data,
                'time'                => $data,
                'code'               => $data,
                'msg'                => $msg,
);

PHP中二進(jìn)制的難點(diǎn)在于如何使用pack和unpack函數(shù),用法可以參考手冊,使用這兩個(gè)函數(shù)時(shí)需要考慮字節(jié)序使用哪種字節(jié)序,要求服務(wù)端和客戶端都使用同一種字節(jié)序打包解包。
http://php.net/manual/zh/function.pack.php
http://php.net/manual/zh/function.unpack.php

以上是PHP二進(jìn)制打包解包的例子,代碼見https://github.com/walkor/workerman/blob/master/applications/Statistics/Bootstrap/StatisticWorker.php#L283

其他語言的二進(jìn)制打包函數(shù)或者方法可能有所不同,具體參考所使用語言對應(yīng)的手冊,但是原理及傳輸?shù)臄?shù)據(jù)都是通用的

  • 暫無評論
年代過于久遠(yuǎn),無法發(fā)表回答
??