websocket傳輸二進制要怎么設(shè)置協(xié)議頭的一個標(biāo)記位
websocket協(xié)議中在協(xié)議頭中使用一個標(biāo)記位來標(biāo)記傳輸?shù)氖嵌M制數(shù)據(jù)還是utf8文本數(shù)據(jù),瀏覽器會驗證標(biāo)記和傳輸?shù)膬?nèi)容類型是否符合,如果不符合則會報錯斷開連接。
所以服務(wù)端發(fā)送數(shù)據(jù)的時候需要根據(jù)傳輸?shù)臄?shù)據(jù)類型設(shè)置這個標(biāo)記位,在Workerman中如果是普通utf8文本,則需要設(shè)置
use Workerman\Protocols\Websocket;
$connection->websocketType = Websocket::BINARY_TYPE_BLOB;
如果是二進制數(shù)據(jù),則需要設(shè)置
use Workerman\Protocols\Websocket;
$connection->websocketType = Websocket::BINARY_TYPE_ARRAYBUFFER;
注意:如果沒設(shè)置$connection->websocketType,則默認(rèn)$connection->websocketType為BINARY_TYPE_BLOB(也就是utf8文本類型)。一般應(yīng)用傳輸?shù)亩际莡tf8文本,例如傳輸?shù)氖莏son數(shù)據(jù),所以不用手動設(shè)置$connection->websocketType。只有在傳輸二進制數(shù)據(jù)時(例如圖片數(shù)據(jù)、protobuffer數(shù)據(jù)等)才要設(shè)置此屬性為BINARY_TYPE_ARRAYBUFFER。
$foo = new UserLogin();
$foo->setUserId(intval(122));
$foo->setUserName('redyn');
$packed = $foo->serializeToString();
$foo->reset();
echo $packed;
$connection->websocketType = Websocket::BINARY_TYPE_ARRAYBUFFER;
$connection->send($packed);
我這樣寫,前端收到的數(shù)據(jù)為空,長度為0,請問哪里錯了嗎。protobuffer的