jsとgoドッキングWebSocketで発生した問題の概要

目次 を生成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は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文字列からutf8-uint8Array []、utf8-uint8Arrayから文字列

  • ヘッダーや本文などのテキスト構造の場合、jsのデフォルトはutf16であるため、utf8コンバーターを使用する必要があります。
// 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.4jsonシリアル化

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

2.5uint8Arrayのステッチと読み取り

// 拼接
// 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パック(メッセージID、ヘッダー、本文)

  • すべてをエンコードし、例を使用します。
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パケットプロトコルの長さを取得します。これは、パケットプロトコルの長さより4短いです
。•ストリームは、パケットユニットであるuint8Arrayタイプです
。•uint32を返します。

var l = lengthOf(stream)

3.2.2 messageIDOf(stream)

•パケットプロトコルでメッセージ番号を取得します
•ストリームはパケットユニットであるuint8Arrayタイプです
uint32を返します

var messageID = messageIDOf(stream)

3.2.3 headerLengthOf(stream)

•パケットプロトコルのヘッダーの長さを取得します
•ストリームはパケットユニットであるuint8Arrayタイプです
uint32を返します

var headerLength = headerLengthOf(stream)

3.2.4 headerOf(stream)

•パケットプロトコルでヘッダーを取得します
•ストリームはパケットユニットであるuint8Arrayタイプです
オブジェクトを返します{}

var header = headerOf(stream)

3.2.5 urlPatternOf(stream)

•パケットプロトコルのヘッダーの長さを取得します
•ストリームはタイプuint8Arrayであり、これはパケットユニットです
•戻り文字列

var urlPattern = urlPatternOf(stream)

3.2.6 bodyLengthOf(stream)

•パケットプロトコルで本文の長さを取得します
•ストリームはパケットユニットであるuint8Arrayタイプです
uint32を返します

var bodyLength = bodyLengthOf(stream)

3.2.7 bodyOf(stream)

•パケットプロトコルで本文を取得します
•ストリームはパケットユニットであるuint8Arrayタイプです
オブジェクトを返します{}

var body = bodyOf(stream)

おすすめ

転載: blog.csdn.net/fwhezfwhez/article/details/107077239