重新安wordpress网站,2345浏览器,建设局网站项目负责人资质要求,安徽省经工建设集团公司网站最近在学习go websocket的时候#xff0c;在学习实验过程遇到一个比较奇怪问题。为什么我的数据返回是blob#xff0c;而不是arrayBuffer#xff1f;百思不得其解。
直到同事打包的时候微信小游戏遇到了一个报错。FileReader不支持。 经过在社区查询#xff0c;官方答复是…最近在学习go websocket的时候在学习实验过程遇到一个比较奇怪问题。为什么我的数据返回是blob而不是arrayBuffer百思不得其解。
直到同事打包的时候微信小游戏遇到了一个报错。FileReader不支持。 经过在社区查询官方答复是支持只是arraybuffer /string。那样在coco creator 调试的时候为什么返回的是blob 而在微信的开发工作发现返回是Arraybuffer。
1.问题实验追踪
在今晚我尝试做了一个实验在结合gpt 交流发现一个问题。首选我们以这样一个小案例进行实验。监听8080的端口然后返回的时候进行打印。
!DOCTYPE html
html langen
headmeta charsetUTF-8titlewebSocket 返回类型问题/title
/head
body
script typetext/javascriptconst socket new WebSocket(ws://localhost:8080);socket.onmessage (event) {if (event.data instanceof ArrayBuffer) {// 返回ArrayBuffer数据const arrayBuffer event.data;// 打印二进制数据console.log(接收的二进制数据:, arrayBuffer);}};
/script
/body
/html在第一次返回的时候监听这个数据返回类型是Blob。的确是Blob类型。
好进行第二次的设置修改上述的代码加入了一个属性。 socket.binaryType “arraybuffer”; 设置返回类型。
!DOCTYPE html
html langen
headmeta charsetUTF-8titlewebSocket 返回类型问题/title
/head
body
script typetext/javascriptconst socket new WebSocket(ws://localhost:8080);socket.binaryType arraybuffer; //加入binaryType 指定返回类型socket.onmessage (event) {if (event.data instanceof ArrayBuffer) {// 返回ArrayBuffer数据const arrayBuffer event.data;// 打印二进制数据console.log(接收的二进制数据:, arrayBuffer);}};
/script
/body
/html然后再次查看返回数据结果返回的类型变化了。猜测是只要设置了就能够返回指定数据。在没有设置类型的时候默认是Blob类型。
看似简单的一个问题没有留意就突然不知道怎么解释。以下为go测试代码。通过这样快速检测数据则可以指定对应类型返回。
package mainimport (fmtgithub.com/gorilla/websocketlognet/http
)var upgrader websocket.Upgrader{CheckOrigin: func(r *http.Request) bool {return true},
}func main() {http.HandleFunc(/, onMessage)err : http.ListenAndServe(:8080, nil)if err ! nil {log.Fatal(err)}
}func onMessage(w http.ResponseWriter, r *http.Request) {conn, err : upgrader.Upgrade(w, r, nil)if err ! nil {fmt.Println(err)return}defer conn.Close()data : make([]byte, 2)data[0] 1data[1] 2//发送 给客户端err conn.WriteMessage(websocket.BinaryMessage, data)if err ! nil {fmt.Println(err)return}
}
当h5 返回的是Blob的时候应该如何读取改造一下读取方式。采用FileReader的方式进行读取。这样就可以满足到2种类型处理了。
!DOCTYPE html
html langen
headmeta charsetUTF-8titlewebSocket 返回类型问题/title
/head
body
script typetext/javascriptconst socket new WebSocket(ws://localhost:8080);//socket.binaryType arraybuffer; //加入binaryType 指定返回类型socket.onmessage (event) {if (event.data instanceof ArrayBuffer) {// 返回ArrayBuffer数据const arrayBuffer event.data;// 打印二进制数据console.log(接收的二进制数据:, arrayBuffer);}else if(event.data instanceof Blob){readBlob(event.data)}};function readBlob(blob){const reader new FileReader();reader.onload (event) {// 获取读取的结果const result event.target.result;if (result instanceof ArrayBuffer) {const arrayBuffer result;// 打印二进制数据console.log(接收的二进制数据:, arrayBuffer);} else {console.error(Failed to read Blob as ArrayBuffer.);}};reader.readAsArrayBuffer(blob);}
/script
/body
/html同理这样可以解析到一个问题。数据返回需要设置一下就能返回指定的类型在没有指定的时候就默认是Blob。而刚碰见微信小游戏不支持FileReader引发报错而微信小游戏返回是直接ArrayBuffer。 这样就能解释并非引擎的问题。只是一个属性参数忘记设置导致的。
好了。今晚实验到此为止。