js和go對接websocket遇到的問題彙總

Table of Contents generated with DocToc

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)
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章