js和go对接websocket遇到的问题汇总

    技术2022-07-12  78

    Table of Contents generated with DocToc

    1. 包协议2. 相关操作 2.1 大端编码2.2 大端解码2.3 string转utf8-uint8Array[], utf8-uint8Array转string2.4 json序列化2.5 uint8Array拼接和读取 3. js-api 3.1 编码 3.1.1 pack(messageID, header, body)3.1.2 packURL(urlPattern, body)3.1.3 packSerialURL(urlPattern, body)3.1.4 packPipeURL(params) 3.2解码 3.2.1 lengthOf(stream)3.2.2 messageIDOf(stream)3.2.3 headerLengthOf(stream)3.2.4 headerOf(stream)3.2.5 urlPatternOf(stream)3.2.6 bodyLengthOf(stream)3.2.7 bodyOf(stream)

    1. 包协议

    // [4]byte -- length fixed_size,binary big endian encode // [4]byte -- messageID fixed_size,binary big endian encode // [4]byte -- headerLength fixed_size,binary big endian encode // [4]byte -- bodyLength fixed_size,binary big endian encode // []byte -- header marshal by json // []byte -- body marshal by json

    2. 相关操作

    2.1 大端编码

    将uint32的数字,转变成[4]byte。 []byte对应js里的uint8Array // params:: uint32 // return uInt8Array[4] function daduanbianma(params) { var bytes = new ArrayBuffer(4) var view = new DataView(bytes) // 大端编码 var number = params view.setUint32(0, number, false) return new Uint8Array(bytes) }

    2.2 大端解码

    // params: uint8Array[4] // return uint32 function daduanjiema(params) { const buf = Buffer.from(params); return buf.readUInt32BE(0) }

    2.3 string转utf8-uint8Array[], utf8-uint8Array转string

    对header,body这样的文本结构,需要使用utf8转换器,因为js默认的是utf16. // params::string // return uint8Array[] function encodeUTF8(params) { var encoder = new TextEncoder('utf-8') var buf = encoder.encode(params) return buf } // params:: 由go服务端产生的utf8编码的uint8Array[] // return string func decodeUTF8UintArray(params) { var decoder = new TextDecoder('utf-8') var jsonStr = decoder.decode(params) return jsonStr }

    2.4 json序列化

    // 将{}转化为json string var jsonobj = {'name': 'ft'} var jsonstr = JSON.stringify(jsonobj) // 将json string 转 json obj var obj = JSON.parse(jsonstr)

    2.5 uint8Array拼接和读取

    // 拼接 // xulieLength 和 messageId均为 Uint8Array var concatArray = new Uint8Array([...xulieLength,...messageId]) // 截取 // buffer为ArrayBuffer类型,从流中读取出来的默认类型 // 该句表示,头长度记录在该段序列的第八位后4个长度 var headerLengthBytes = new Uint8Array(buffer, 8, 4);

    3. js-api

    地址: http://www.baidu.com, 待更

    3.1 编码

    3.1.1 pack(messageID, header, body)

    编码全部,使用示例: pack(0, { Router-Type:'URL_PATTERN', URL-Pattern-Value: '/user-pool/kf-user-info/login/', }, { chanel: 'web, })

    3.1.2 packURL(urlPattern, body)

    等价于 pack(0, { Router-Type:'URL_PATTERN', URL-Pattern-Value: urlPattern, }, body)

    示例:

    packURL('/user-pool/kf-user-info/login/', {chanel: 'web'})

    3.1.3 packSerialURL(urlPattern, body)

    发送的消息将被串行处理,该消息处理完毕以前,后续的消息会等待。一般应用于登录,鉴权,验证等。等价于 pack(2020, { Router-Type:'URL_PATTERN', URL-Pattern-Value: urlPattern, }, body) 示例: packSerialURL('/user-pool/kf-user-info/login/', {chanel: 'web'})

    3.1.4 packPipeURL(params)

    该串消息,将会同步按顺序执行,并且,params里的消息集互为串行,和其他的消息为并行。 params格式为: [ { urlPattern: '/user-pool/kf-user-info/login/', body: {chanel: 'web'} }, { urlPattern: '/user-pool/kf-user-info/login/', body: {chanel: 'web'} }, ]

    3.2解码

    3.2.1 lengthOf(stream)

    • 获取#1的包协议中length,它比一个包协议长度少4 • stream 是 uint8Array类型,为一个包单位 • 返回uint32

    var l = lengthOf(stream)

    3.2.2 messageIDOf(stream)

    • 获取包协议中的消息号 • stream是uint8Array类型,为一个包单位 • 返回uint32

    var messageID = messageIDOf(stream)

    3.2.3 headerLengthOf(stream)

    • 获取包协议中的头部长度 • stream是uint8Array类型,为一个包单位 • 返回uint32

    var headerLength = headerLengthOf(stream)

    3.2.4 headerOf(stream)

    • 获取包协议中的头部 • stream是uint8Array类型,为一个包单位 • 返回对象{}

    var header = headerOf(stream)

    3.2.5 urlPatternOf(stream)

    • 获取包协议中的头部长度 • stream是uint8Array类型,为一个包单位 • 返回string

    var urlPattern = urlPatternOf(stream)

    3.2.6 bodyLengthOf(stream)

    • 获取包协议中的body长度 • stream是uint8Array类型,为一个包单位 • 返回uint32

    var bodyLength = bodyLengthOf(stream)

    3.2.7 bodyOf(stream)

    • 获取包协议中的body • stream是uint8Array类型,为一个包单位 • 返回对象{}

    var body = bodyOf(stream)
    Processed: 0.010, SQL: 9