websocket传输二进制要怎么设置协议头的一个标记位

redyn

websocket传输二进制要怎么设置协议头的一个标记位

8689 3 0
3个回答

walkor

websocket协议中在协议头中使用一个标记位来标记传输的是二进制数据还是utf8文本数据,浏览器会验证标记和传输的内容类型是否符合,如果不符合则会报错断开连接。

所以服务端发送数据的时候需要根据传输的数据类型设置这个标记位,在Workerman中如果是普通utf8文本,则需要设置

use Workerman\Protocols\Websocket;
$connection->websocketType = Websocket::BINARY_TYPE_BLOB;

如果是二进制数据,则需要设置

use Workerman\Protocols\Websocket;
$connection->websocketType = Websocket::BINARY_TYPE_ARRAYBUFFER;

注意:如果没设置$connection->websocketType,则默认$connection->websocketType为BINARY_TYPE_BLOB(也就是utf8文本类型)。一般应用传输的都是utf8文本,例如传输的是json数据,所以不用手动设置$connection->websocketType。只有在传输二进制数据时(例如图片数据、protobuffer数据等)才要设置此属性为BINARY_TYPE_ARRAYBUFFER。

  • 暂无评论
redyn
$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);

我这样写,前端收到的数据为空,长度为0,请问哪里错了吗。protobuffer的

  • 暂无评论
redyn

问题已解决,多谢了

  • 暂无评论
年代过于久远,无法发表回答
🔝