go学习笔记(17)Blob and ArrayBuffer

最近在学习go websocket的时候,在学习实验过程遇到一个比较奇怪问题。为什么我的数据返回是blob,而不是arrayBuffer?百思不得其解。

直到同事打包的时候微信小游戏遇到了一个报错。FileReader不支持。
经过在社区查询,官方答复是支持只是arraybuffer /string。那样在coco creator 调试的时候为什么返回的是blob? 而在微信的开发工作发现返回是Arraybuffer。

1.问题实验追踪

在今晚我尝试做了一个实验,在结合gpt 交流发现一个问题。首选我们以这样一个小案例进行实验。监听8080的端口,然后返回的时候进行打印。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>webSocket 返回类型问题</title>
</head>
<body>
<script type="text/javascript">
    const 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 lang="en">
<head>
    <meta charset="UTF-8">
    <title>webSocket 返回类型问题</title>
</head>
<body>
<script type="text/javascript">
    const 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 main

import (
	"fmt"
	"github.com/gorilla/websocket"
	"log"
	"net/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] = 1
	data[1] = 2

	//发送 给客户端
	err = conn.WriteMessage(websocket.BinaryMessage, data)
	if err != nil {
		fmt.Println(err)
		return
	}
}

当h5 返回的是Blob的时候应该如何读取?改造一下读取方式。采用FileReader的方式进行读取。这样就可以满足到2种类型处理了。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>webSocket 返回类型问题</title>
</head>
<body>
<script type="text/javascript">
    const 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。 这样就能解释并非引擎的问题。只是一个属性参数忘记设置导致的。

好了。今晚实验到此为止。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/231890.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

链表OJ—环形链表||

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 1、环形链表题目&#xff1a; 2、方法讲解&#xff1a; 图文解析&#xff1a; 代码实现&#xff1a; 其他的两种情况&#xff1a; 总结 前言 世上有两种耀眼的光芒…

leetcode刷题日志-54螺旋矩阵

思路&#xff1a; 上下左右设置四个边界 每走完一行或者一列&#xff0c;移动相应边界&#xff0c;当左边界大于右边界&#xff0c;或者上边界大于下边界时&#xff0c;结束 代码如下&#xff1a; class Solution {public List<Integer> spiralOrder(int[][] matrix) {…

temu我的订单在哪里看

在Temu平台上购物是一件令人愉快的事情&#xff0c;但有时候我们可能会忘记如何查看我们的订单。在本文中&#xff0c;我们将逐步介绍如何在Temu平台上查看您的订单&#xff0c;以便您可以轻松管理您的购物记录。 先给大家推荐一款拼多多/temu运营工具——多多情报通多多情报通…

【Vulnhub 靶场】【Hackable: III】【简单 - 中等】【20210602】

1、环境介绍 靶场介绍&#xff1a;https://www.vulnhub.com/entry/hackable-iii,720/ 靶场下载&#xff1a;https://download.vulnhub.com/hackable/hackable3.ova 靶场难度&#xff1a;简单 - 中等 发布日期&#xff1a;2021年06月02日 文件大小&#xff1a;1.6 GB 靶场作者&…

4_CSS选择器进阶

day04_CSS选择器应用 Objective&#xff08;本课目标&#xff09; 掌握复合选择器掌握后代选择器掌握并集选择器掌握标签显示模式和转换掌握CSS背景 1. CSS复合选择器 1.1 后代选择器&#xff08;重点&#xff09; 作用&#xff1a;用来选择元素或元素组的子孙后代 案例 -…

Abaqus Creat Field Output

1、获取应力不变量 s2f33_S.getScalarField(invariantMISES) 2、获得应力分量 s2f33_S.getScalarField(componentLabel"S11") 参考&#xff1a; https://www.eng-tips.com/viewthread.cfm?qid469545

深化适老化服务——建行江门市分行成功打造首家“适老化”服务示范网点

新金融时代&#xff0c;银行物理网点要更好发挥客户面对面接触、情感交互、场景引流、生态建设等功能&#xff0c;开展特色网点建设转型势在必行。 近日&#xff0c;建行江门市分行恩平锦江支行“适老化”服务示范网点开业。走进锦江支行网点大堂&#xff0c;“暖阳港湾”四个…

SAP 批量修改IDOC内容

近第三方系统出现一个问题&#xff0c;导致IDOC发过来的数据都是错误的&#xff0c;但是因为某些原因&#xff0c;无法在第三方系统中重新发起&#xff0c;故需要批量修改IDOC的内容&#xff0c;并且重新在SAP中发起入站 经了解SAP提供了标准的事务代码可以进行简单的IDOC内容…

2023年9月8日 Go生态洞察:gopls的扩展与Go生态系统的成长

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

更改Android Studio的.android和.gradle文件夹默认位置

一、首先关闭Android Studio&#xff0c; 二、目标位置新建文件夹 这一步&#xff0c;为了省去麻烦&#xff0c;我并没有直接在我的目标位置新建文件夹&#xff0c;而是把C盘下的.android和.gradle文件夹整个复制过来&#xff0c;和SDK都在同一目录下&#xff0c;感觉这样可以…

Qt之实现文字滚动效果

一.效果 二.实现 roller.h #ifndef ROLLER_H #define ROLLER_H#include <QWidget> #include <QPaintEvent> #include <QShowEvent> #include <QHideEvent> #include <QTimer>class Roller : public QWidget { public:explicit Roller(QWidget …

【序列化】概念及二叉树序列化、反序列化的两种方式

序列化是什么&#xff1f;为什么需要序列化&#xff1f; 前言&#xff1a; &#xff08;1&#xff09;进程想要运行&#xff0c;就要向操作系统申请内存空间&#xff0c;进程对数据的所有操作都是在内存空间中完成的。内存中有一部分数据很重要&#xff0c;我们希望将这些数据存…

Java基础-java.util.Scanner接收用户输入

目录 1. 导入所需要的jar包2. 编写代码运行3. 输出运行结果 1. 导入所需要的jar包 import java.util.Scanner;2. 编写代码运行 public class ScannerDemo {public static void main(String[] args) {/** 使用Scanner接收用户键盘输入的数据* 1. 导包&#xff1a;告诉程序去JD…

springboot077基于SpringBoot的汽车票网上预订系统

springboot077基于SpringBoot的汽车票网上预订系统 源码获取&#xff1a; https://docs.qq.com/doc/DUXdsVlhIdVlsemdX

零基础学Python第七天||字符串(4)

字符串的内容的确不少&#xff0c;甚至都有点啰嗦了。但是&#xff0c;本节依然还要继续&#xff0c;就是因为在编程实践中&#xff0c;经常会遇到有关字符串的问题&#xff0c;而且也是很多初学者容易迷茫的。 字符串格式化输出 什么是格式化&#xff1f;在维基百科中有专门…

jsp使用 分页专用工具

分页器&#xff0c;根据过来的参数计算当着页应当从哪一条记录开始显示&#xff0c;并且显示到哪。 PageUtils [pageSize5, currIndex1, totalCount166, totalPage34, startPosition0] PageUtils [pageSize5, currIndex5, totalCount166, totalPage34, startPosition20] PageUt…

深度学习基础介绍

定义&#xff1a; 深度学习是机器学习领域中一个新的研究方向&#xff0c;被引入机器学习使其更接近于最初的目标&#xff0c;即人工智能AI&#xff0c; Artifical Intelligence。 深度学习是学习样本数据的内在规律和表示层次&#xff0c;这些学习过程中获得的信息对诸如文字…

Leetcode 39 组合总和

题意理解&#xff1a; 一个 无重复元素 的整数数组 candidates 和一个目标整数 target 从candidates 取数字&#xff0c;使其和 target &#xff0c;有多少种组合&#xff08;candidates 中的 同一个 数字可以 无限制重复被选取&#xff09; 这道题和之前一道组合的区别&am…

Databend 如何利用 GPT-4 进行质量保证

背景 在数据库行业&#xff0c;质量是核心要素。 Databend 的应用场景广泛&#xff0c;特别是在金融相关领域&#xff0c;其查询结果的准确性对用户至关重要。因此&#xff0c;在快速迭代的过程中&#xff0c;如何确保产品质量&#xff0c;成为我们面临的重大挑战。 随着 Da…

IDEA项目发布中,Web Application:Exploded和Web Application:Archive的详细解释

简单总结下&#xff1a; 1、web application:exploded&#xff1a;这个是以文件夹形式发布项目&#xff0c;发布项目时就会自动生成文件夹在指定的output directory&#xff1b;&#xff08;开发&#xff09; 2、web application:archive&#xff1a;就是war包形式&#xff0…