首页 > 其他分享 >js和go对接websocket遇到的问题汇总

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

时间:2022-11-22 23:34:42浏览次数:88  
标签:body websocket stream uint8Array js var 3.2 go params


Table of Contents generated with DocToc

  • ​​1. 包协议​​
  • ​2. 相关操作​
  • ​​2.1 大端编码​​
  • ​​2.2 大端解码​​
  • ​​2.3 string转utf8-uint8Array[], utf8-uint8Array转string​​
  • ​​2.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)


标签:body,websocket,stream,uint8Array,js,var,3.2,go,params
From: https://blog.51cto.com/u_11553781/5878740

相关文章

  • 如何给旧版的go仓库,添加go1.12兼容
    需要确认GOROOT在1.12以上,并且,GO111MODULE必须为ongomodinitgithub.com/****/projectNamegomodtidy当出现依赖的第三方包版本不一致时。修改go.mod,比如uuid包的某次has......
  • go 1.12以下,给服务器增加包依赖的自动化脚本
    前言旧版的go不支持module,所以包依赖需要手动引入。本文仅记录用过的脚本,方便以后复制。需要对具体的包增加具体的脚本#本脚本,需要在服务上预先配置好go1.9,GOPATH,GOROO......
  • golang算法—— 使用两个栈实现一个队列
    前言阅读本文,假定已经了解了基本数据结构概念。队列:先入先出。栈:先进后出。分析使用两个栈串联,可以实现先进先出。但是,得注意以下两点:队列在入列时,stack2必须为空,stac......
  • golang grpc使用示例
    疑问写前面grpc有内部对心跳的处理吗,还是说,双工需要自己作心跳管理,有懂的留言一下。SEO优化grpc如何双工通信?grpc如何从服务端推送消息给客户端?gprc环境如何搭建?grpc......
  • memcached 使用与go客户端调用
    介绍详细的介绍参考:​​​https://www.runoob.com/memcached/memcached-tutorial.html​​由于memcached仅仅是一个高度内存的kv存储块,如果有更严谨的需求,需要如下选择:集......
  • go语言入门
    go目录简介/bin:包含可执行文件,如:编译器,Go工具/doc:包含文档模版/lib:包含示例程序,代码工具,本地文档等/misc:包含与支持Go编辑器有关的配置文件以及cgo的示例/os_a......
  • JWT( JSON Web Token —— JSON Web 令牌 )的学习笔记
    一、跨域认证的问题互联网服务离不开用户认证。一般流程是下面这样:1、用户向服务器发送用户名和密码。2、服务器验证通过后,在当前对话(session)里面保存相关数据,比如用......
  • 利用Docker、云服务器、mongodb搭建自己的测试平台
    准备一个云服务器购买一个云服务器,在阿里云,腾讯云上购买即可。然后创建一个实例,安装Linux操作系统,我安装的是CentOS。记住账号和密码,可以使用ssh远程登录即可。 ......
  • leetcode 88. 合并两个有序数组 js实现
    给你两个按 非递减顺序 排列的整数数组 nums1 和 nums2,另有两个整数 m 和 n ,分别表示 nums1 和 nums2 中的元素数目。请你 合并 nums2 到 nums1 中,使合......
  • Go语言SQL语句到结构体的转换命令行工具
    学习:SQL语句到结构体的转换|Go语言编程之旅(eddycjy.com)目标:SQL表转换为Go语言结构体可以在线体验这个过程:SQL生成GO语言结构体-支持批量处理(tl.beer)MySQL数......