在昨晚实验中可以看到websocket 似乎支持二进制发送,这一点不知道是否有坑?大部分情况下,还是先保留一些意见。今晚的内容测试一下ArrayBuffer。
1.改造一下golang 发送包
改造只是改成发送一个二进制数据 32位,4个字节的数据,让小程序去接收。
package main
import (
"bytes"
"encoding/binary"
"fmt"
"net/http"
"golang.org/x/net/websocket"
)
func main() {
http.Handle("/message", websocket.Handler(onMessage))
err := http.ListenAndServe(":8081", nil)
if err != nil {
panic("ListenAndServe: " + err.Error())
}
}
func onMessage(ws *websocket.Conn) {
var err error
for {
var receivemsg string
if err = websocket.Message.Receive(ws, &receivemsg); err != nil {
fmt.Println("can't not receive message")
break
}
if receivemsg != "" {
if receivemsg == "1001" {
//使用buffer 去写
buf := bytes.NewBuffer([]byte{})
tmp := uint32(10001)
binary.Write(buf, binary.BigEndian, tmp)
websocket.Message.Send(ws, buf.Bytes())
} else {
websocket.Message.Send(ws, "不存在指令")
}
}
}
}
2.接收golang 发送过来的二进制数据
在小程序里面从文档可以看到支持ArrayBuffer,尝试在客户端先进行一个测试。
this.socket.onMessage((res)=>{
console.log("收到消息:"+res.data)
this.setData({ content: "收到消息:" +res.data})
var buf = res.data
console.log("长度" + buf.byteLength)
var dataview = new DataView(buf)
var r = dataview.getUint32();
console.log("返回结果:"+r);
})
ArrayBuffer 采用DataView 去解析数据。然后获取后端发送返回的二进制数据。查看下面的图可以看到小程序接收到ArrayBuffer,但这个值不能直接显示。需要进行转换一下。
从图中可以,返回结果和自己在后端编写的结果可以保持一致。这样可以根据协议来实现更多二进制数据解析。
好,今晚到此为止。