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

5 篇文章 0 订阅

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)
对接 Websocket,需要完成以下步骤: 1. 创建 WebSocketServer WebSocketServer 是一个 Java 类,它可以监听 WebSocket 请求并处理它们。创建一个 WebSocketServer 类,并在其中实现 onOpen、onClose、onMessage、onError 方法。这些方法分别对应 WebSocket 的打开、关闭、接收消息、错误事件。 2. 配置 WebSocketServer 在 WebSocketServer 中,需要配置 Endpoint 和 ServerEndpoint 注解。Endpoint 注解用于定义 WebSocketServer 类,而 ServerEndpoint 注解用于定义 WebSocket 的 URL 地址。 ``` @ServerEndpoint("/websocket") public class MyWebSocketServer { @OnOpen public void onOpen(Session session) { // WebSocket 打开时回调 } @OnClose public void onClose(Session session) { // WebSocket 关闭时回调 } @OnMessage public void onMessage(String message, Session session) { // 接收到消息时回调 } @OnError public void onError(Throwable throwable) { // 发生错误时回调 } } ``` 3. 启动 WebSocketServer 在应用程序中,需要将 WebSocketServer 启动起来,以便它能够接收和处理 WebSocket 请求。可以将 WebSocketServer 部署在 Tomcat、Jetty 或其他支持 WebSocket 的 Web 服务器上。 4. 使用 WebSocket 在客户端代码中,需要创建一个 WebSocket 对象,并连接到 WebSocketServer。可以使用 JavaScript 或其他编程语言来实现 WebSocket 客户端。 以上是对接 WebSocket 的基本步骤,需要根据实际情况进行具体的调整和实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值