美文网首页
记一次websocket开发实践(ArrayBuffer)

记一次websocket开发实践(ArrayBuffer)

作者: 1f9bf7ea5536 | 来源:发表于2020-06-28 19:43 被阅读0次

    这里只是简单记录一下,不足之处请多指正。

    在这次开发中,我们把要发送的消息分为文字类型消息和文件类型消息,文件类型消息包括图片,文件,音频,视频等,所有的消息都会通过new FileReader()方法转换成arraybuffer类型,然后发送给服务器,为了方便服务器区分消息类型同时做对应处理,我们需要在这个arraybuffer数组里添加一些说明信息,比如消息类型标识,接收人等,具体规则如下:

    文字类型消息

    消息类型标识:13,占两个字节;
    接收人code长度:toCode.length,占两个字节;
    接收人code: toCode,占toCode.length个字节;
    定义好规则后就是组装数据,首先定义一个新的arraybuffer对象,其长度是:消息类型标识13(2字节)+toCode.byteLength(2字节)+toCode(toCode.byteLength个字节)+msgArrayBuffer(msgArrayBuffer.byteLength个字节),代码如下:

      let msgArrayBuffer = str2ab(textMsg);
      let toCodeArrayBuffer = str2ab(toCode);
      let sendArrayBuffer = new ArrayBuffer(4 + toCodeArrayBuffer.byteLength + msgArrayBuffer.byteLength); 
      let sendUint8 = new Uint8Array(sendArrayBuffer);
      let headUint16 = new Uint16Array(sendArrayBuffer , 0, 2);//使用双字节引用,取两位(相当于四个字节)
      headUint16[0] = 13;//消息类型
      headUint16[1] = toCodeBuffer.byteLength;//toCode.length   
      let msgUint8 = new Uint8Array(msgArrayBuffer);//使用单字节引用
      for (let i = 0; i < msgUint8.length; i++) {//循环将文本消息写要发送的arraybuffer中
           sendUint8[i + 4 + toCodeArrayBuffer.byteLength] = msgUint8[i];
      }
      ws.send(sendUint8)//发送
    

    服务器接收到数据后会按照定好的规则解析,首先取1、2两个字节,用来区分消息类型再取3、4两个字节用来获取toCode的长度然后从第5个字节开始到toCode长度的位置,取toCode字符串最后从toCode长度往后一个字节的位置开始到末尾就是文本消息。

    文件类型消息

    消息类型标识:31(图片,其它类型可自定义),占两个字节;
    接收人code长度:toCode.length,占两个字节;
    接收人code: toCode,占toCode.length个字节;
    文件名称长度:fileName.length,占两个字节;
    文件名称:fileName,占fileName.length个字节;

    定义好规则后就是组装数据,首先定义一个新的arraybuffer对象,其长度是:消息类型标识31(2字节)+toCode.byteLength(2字节)+fileName.byteLength(2个字节)+fileName(fileName.byteLength个字节)+msgArrayBuffer(msgArrayBuffer.byteLength个字节),代码可以参考文本消息。

    ArrayBuffer的使用可以参考MDN https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/ArrayBuffer

    相关文章

      网友评论

          本文标题:记一次websocket开发实践(ArrayBuffer)

          本文链接:https://www.haomeiwen.com/subject/hrlwfktx.html