標籤:

PHP socket通信問題, 如何按照自定義的協議進行通信?

現在的業務是要實現某個功能,服務端用的是C,我們客戶端用的是PHP,現在要按照伺服器定義的協議進行通信,進行數據傳送;服務端開發人員給了一個協議包頭和實現業務功能的數據欄位定義的C語言結構體來參考。請問PHP怎麼按照自定義的協議進行通信?


我發一個我項目中用到的例子:

/**
* 結構體如下
* struct statisticPortocol
* {
* unsigned char module_name_len;
* unsigned char interface_name_len;
* float cost_time;
* unsigned char success;
* int code;
* unsigned short msg_len;
* unsigned int time;
* char[module_name_len] module_name;
* char[interface_name_len] interface_name;
* char[msg_len] msg;
* }
* /

// 打包
pack("CCfCNnN", $module_name_length, $interface_name_length, $cost_time, $success, $code, strlen($msg), time()).$module.$interface.$msg;

// 解包
$data = unpack("Cmodule_name_len/Cinterface_name_len/fcost_time/Csuccess/Ncode/nmsg_len/Ntime", $bin_data);

主要是pack 和 unpack方法。打包將欄位按順序pack進去,解包按照順序unpack出來。如果結構體裡面還包含結構體也是一樣按欄位來。

pack unpack使用方法:PHP: pack - ManualPHP: unpack - Manual
需要注意的是網路傳輸二進位一般是網路位元組序( Big endian)
位元組序資料:位元組序_百度百科


建立socket,然後發送或讀取數據,按協議分析數據。最常見是實現http協議實現的代碼,看下就理解了,其他協議類似。需要注意,socket是基於tcp的。


不太清楚你的應用場景是什麼,我講講我用到過的吧。

場景是 webgame 服務端,C++ 負責監聽連接,將合法的連接轉發到 PHP 進程處理,這時候 PHP 可以從標準輸入(php://input)讀到數據,然後用 unpack 解包處理,返回的數據用 pack 構建。


推薦閱讀:

php 如何取img屬性值 src?
wordpress 代碼質量怎麼樣?
新手適合學什麼計算機語言?
大型的 PHP應用 ,通常使用什麼應用做 消息隊列 的?
PHP 與 NodeJS 如何共用 Session?

TAG:PHP | Socket |