websocket 请求头报错 Provisional headers are shown 的解决方法

今日简单总结 websocket 使用过程中遇到的问题,主要从以下三个方面来分享:

1、前端部分 websocket 代码

2、使用 koa.js 实现后端 websocket 服务搭建

3、和后端 java Netty 库对接时遇到连接失败问题

一、前端部分 websocket 代码

<template>
  <div id="app">
    <div v-for="item in messages" :key="item.id">
      {{ item.value }}
    </div>
    <el-form :inline="true">
      <el-form-item label="消息:">
        <el-input v-model="newMessage" placeholder="请输入内容"></el-input>
      </el-form-item>
      <el-form-item>
        <el-button type="primary" @click="sendMessage">发送</el-button>
      </el-form-item>
    </el-form>
    <router-view />
  </div>
</template>

<script>
export default {
  name: 'App',
  data() {
    return {
      messages: [],
      newMessage: '',
      socket: null,
    };
  },

  created() {
    this.initializeWebSocketConnection();
  },
  beforeDestroy() {
    if (this.socket) {
      this.socket.close();
    }
  },
  methods: {
    initializeWebSocketConnection() {
      // 建立连接
      this.socket = new WebSocket('ws://localhost:8083');
      // 客户端向服务端发送消息
      this.socket.onopen = () => {
        this.socket.send(
          JSON.stringify({
            value: this.newMessage,
          })
        );
      };

      // 客户端接收服务端的消息
      this.socket.onmessage = (event) => {
        const res = JSON.parse(event.data);
        this.messages.push(res.data);
      };

      // 错误处理
      this.socket.onerror = (error) => {
        console.error('WebSocket Error:', error);
      };

      // 关闭
      this.socket.onclose = () => {
        console.log('WebSocket connection closed');
      };
    },

    sendMessage() {
      // 手动向服务端发送消息
      if (this.socket.readyState === WebSocket.OPEN) {
        this.socket.send(
          JSON.stringify({
            value: this.newMessage,
          })
        );
        this.newMessage = '';
      } else {
        console.error('Cannot send message, the socket is not open.');
      }
    },
  },
};
</script>

<style>
#app {
  font-family: Avenir, Helvetica, Arial, sans-serif;
  -webkit-font-smoothing: antialiased;
  -moz-osx-font-smoothing: grayscale;
  text-align: center;
  color: #2c3e50;
}
</style>

二、使用 koa.js 实现后端 websocket 服务搭建

// app.js
const Koa = require('koa');
const WebSocket = require('ws');
const { v4: uuidv4 } = require('uuid');

const app = new Koa();
const wss = new WebSocket.Server({
  port: 8083,
});

// 存储所有连接的客户端
const clients = new Set();

wss.on('connection', (ws) => {
  // 新客户端连接时添加到clients集合中
  clients.add(ws);

  console.log('WebSocket connection opened');
  ws.on('message', (message) => {
    console.log('Received message from client:', message);
    try {
      console.log('clients::', clients);
      // 将接收到的字符串转换为JSON对象
      const data = JSON.parse(message);
      // 在此处处理接收到的JSON数据
      console.log('Received data:', data);

      const response = {
        status: '200',
        message: 'success',
        data: {
          id: uuidv4(),
          value: data.value,
        },
      };

      // 将响应的JSON对象转换为字符串并通过WebSocket发送
      ws.send(JSON.stringify(response));
    } catch (error) {
      console.error('Error parsing JSON:', error);
      // 如果解析失败,发送错误消息回客户端
      ws.send(JSON.stringify({ error: 'Invalid JSON format' }));
    }
  });

  ws.on('close', () => {
    // 客户端关闭连接时从clients集合中移除
    clients.delete(ws);
    console.log('WebSocket connection closed');
  });

  ws.on('error', (error) => {
    console.error('WebSocket error:', error);
  });
});

// 假设这个函数会在数据状态改变时被调用
function onDataStateChange(newData) {
  // 遍历所有客户端连接并发送消息
  for (const client of clients) {
    if (client.readyState === WebSocket.OPEN) {
      client.send(
        JSON.stringify({
          status: '200',
          message: 'success',
          data: {
            id: uuidv4(),
            value: '数据发生改变啦...',
          },
        })
      ); // 发送新数据到客户端
    }
  }
}

// 示例:模拟数据状态改变并推送消息
setTimeout(() => {
  const newData = { status: 'updated', value: 'New Value' };
  onDataStateChange(newData); // 模拟数据状态改变,并向所有客户端推送消息
}, 10000); // 5秒后模拟数据改变

app.use(async (ctx) => {
  ctx.body = 'Hello, Koa!';
});

app.listen(3000, () => {
  console.log('Server is running on port 3000');
});

三、和后端 java Netty 库对接时遇到连接失败问题

前端在 1、2 步骤的验证时,websocket 成功建立连接,消息可以正常发送,但是在和后端小伙伴联调时,请求头一直报 Provisional headers are shown 错误,如下图:

原因,后端 java 在使用 Netty 库创建 webSocket 通信时,未添加协议处理器,当后端添加完协议处理器后,前端在进行通信的时候,需要在加上这个前缀,如下图:

前端的修改,如下图:

解决之后的请求头:

可以在 Messages 中看到消息推送,当客户端和服务端建立连接之后,客户端可以向服务端发送消息,服务端也可以向客户端推送消息,实现即时通信功能。如下图:

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

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

相关文章

Spark和Hadoop的安装

实验内容和要求 1&#xff0e;安装Hadoop和Spark 进入Linux系统&#xff0c;完成Hadoop伪分布式模式的安装。完成Hadoop的安装以后&#xff0c;再安装Spark&#xff08;Local模式&#xff09;。 2&#xff0e;HDFS常用操作 使用hadoop用户名登录进入Linux系统&#xff0c;启动…

MyBatisPlus详解(二)条件构造器Wrapper、自定义SQL、Service接口

文章目录 前言2 核心功能2.1 条件构造器2.1.1 Wrapper2.1.2 QueryWrapper2.1.3 UpdateWrapper2.1.4 LambdaQueryWrapper 2.2 自定义SQL2.2.1 基本用法2.2.2 多表关联 2.3 Service接口2.3.1 IService2.3.1.1 save2.3.1.2 remove2.3.1.3 update2.3.1.4 get2.3.1.5 list2.3.1.6 co…

AlDente Pro for mac最新激活版:电池长续航软件

AlDente Pro是一款专为Mac用户设计的电池管理工具&#xff0c;旨在提供电池安全和健康管理的一站式解决方案。它具备实时监控电池状态的功能&#xff0c;让用户随时了解电池的电量、充电次数、健康状态等信息。 AlDente Pro for mac最新激活版下载 同时&#xff0c;AlDente Pro…

STM32 DA数字模拟转换原理

单片机学习&#xff01; 目录 前言 一、AD与DA 二、AD与DA硬件电路模型 三、运算放大器 四、运放电路 4.1 电压比较器 4.2 反相放大器 4.3 同相放大器 4.4 电压跟随器 五、DA原理 总结 前言 之前文章讲述了STM32中AD模拟数字转换器的内容&#xff0c;文中AD原理中涉及DA原理的内…

用python selenium实现短视频一键推送

https://github.com/coolEphemeroptera/VIVI 效果如下 demo 支持youtube视频搬运

【数据结构】顺序表:与时俱进的结构解析与创新应用

欢迎来到白刘的领域 Miracle_86.-CSDN博客 系列专栏 数据结构与算法 先赞后看&#xff0c;已成习惯 创作不易&#xff0c;多多支持&#xff01; 目录 一、数据结构的概念 二、顺序表&#xff08;Sequence List&#xff09; 2.1 线性表的概念以及结构 2.2 顺序表分类 …

华为开源自研AI框架昇思MindSpore应用案例:数据处理性能优化

如果你对MindSpore感兴趣&#xff0c;可以关注昇思MindSpore社区 数据是整个深度学习中最重要的一环&#xff0c;因为数据的好坏决定了最终结果的上限&#xff0c;模型的好坏只是去无限逼近这个上限&#xff0c;所以高质量的数据输入&#xff0c;会在整个深度神经网络中起到积极…

嵌入式Linux开发实操(十八):Linux音频ALSA开发

应用程序程序员应该使用库API,而不是内核API。alsa库提供了内核API 100%的功能,但增加了可用性方面的主要改进,使应用程序代码更简单、更美观。未来的修复程序或兼容性代码可能会放在库代码中,而不是放在内核驱动程序中。 使用ALSA API和libasound进行简单的声音播放: /*…

用全连接对手写数字识别案例(附解决TensorFlow2.x没有examples问题)

数据集介绍 数据集直接调用可能出现问题&#xff0c;建议从官网直接下载下来&#xff0c;下载存在这四个文件 手写数字识别数据集下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1nqhP4yPNcqefKYs91jp9ng?pwdxe1h 提取码&#xff1a;xe1h 55000行训练数据集&a…

CentOS如何使用Docker部署Plik服务并实现公网访问本地设备上传下载文件

文章目录 1. Docker部署Plik2. 本地访问Plik3. Linux安装Cpolar4. 配置Plik公网地址5. 远程访问Plik6. 固定Plik公网地址7. 固定地址访问Plik 本文介绍如何使用Linux docker方式快速安装Plik并且结合Cpolar内网穿透工具实现远程访问&#xff0c;实现随时随地在任意设备上传或者…

Asciinema:一款强大的终端录屏工具

最近看见一个好的终端录屏工具&#xff0c;现在记录一下并进行分享。 终端录屏工具asciinema是一个免费和开源的解决方案&#xff0c;用于记录终端会话并在网上分享。它支持在终端内直接录制&#xff0c;提供播放、复制粘贴和嵌入功能。安装方面&#xff0c;支持多种操作系统&…

Git 原理及使用 (带动图演示)

文章目录 &#x1f308; Ⅰ Git 安装&#x1f319; 01. Linux - centos &#x1f308; Ⅱ Git 工作区、暂存区和版本库&#x1f319; 01. 认识工作区、暂存区和版本库&#x1f319; 02. 使用 Git 管理工作区的文件 &#x1f308; Ⅲ Git 基本操作&#x1f319; 01. 创建本地仓库…

使用代理绕过网站的反爬机制

最近在尝试收集一些网络指标的数据&#xff0c; 所以&#xff0c; 我又开始做爬虫了。 :) 我们在做爬虫的过程中经常会遇到这样的情况&#xff0c;最初爬虫正常运行&#xff0c;正常抓取数据&#xff0c;一切看起来都是那么的美好&#xff0c;然而一杯茶的功夫可能就会出现错误…

YOLOv9改进策略 | Conv篇 | 利用YOLO-MS的MSBlock二次创新RepNCSPELAN4(全网独家创新)

一、本文介绍 本文给大家带来的改进机制是利用YOLO-MS提出的一种针对于实时目标检测的MSBlock模块(其其实不能算是Conv但是其应该是一整个模块)&#xff0c;我们将其用于RepNCSPELAN中组合出一种新的结构&#xff0c;来替换我们网络中的模块可以达到一种轻量化的作用&#xff…

Vue3+TS版本Uniapp:项目前置操作

作者&#xff1a;前端小王hs 阿里云社区博客专家/清华大学出版社签约作者✍/CSDN百万访问博主/B站千粉前端up主 环境&#xff1a;使用vscode进行开发 如果一开始是使用的HbuilderX&#xff0c;请看hbuilderX创建的uniapp项目转移到vscode 为什么选择vscode&#xff1f;有更好…

Ceph 分布式文件系统 搭建及使用

一、Ceph 介绍 在当今数据爆炸式增长的时代&#xff0c;企业对于可靠、可扩展的存储解决方案的需求日益迫切。Ceph 作为一种开源的、可伸缩的分布式存储解决方案&#xff0c;正逐渐成为企业级存储领域的热门选择。Ceph是一种由Radicalbit公司开发的开源分布式存储系统&#xf…

学习微服务nacos遇到的问题

在学习微服务注册到nacos的时候&#xff0c;所有过程都正确了&#xff0c;注册也成功了&#xff0c;但是访问不了调用的地址报错出现问题。 一、引入依赖 在cloud-demo父工程的pom文件中的<dependencyManagement>中引入SpringCloudAlibaba的依赖 1、springboot <pa…

【系统分析师】软件工程

文章目录 1、信息系统生命周期2、软件开发模型2.1 原型及其演化2.2 增量模型和螺旋模型2.3 V模型、喷泉模型、快速应用开发2.4 构件组装模型2.5 统一过程-UP2.6 敏捷方法 3、逆向工程4、净室软件工程 【写在前面】 记录了一系列【系统分析师】文章&#xff0c;点击下面的链接&a…

Python 全栈安全(二)

原文&#xff1a;annas-archive.org/md5/712ab41a4ed6036d0e8214d788514d6b 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第二部分&#xff1a;认证与授权 本书的第二部分是最具商业价值的部分。我这样说是因为它充满了大多数系统需要具备的实用工作流示例&#xf…

Linux 系统systemd(pid=1)占用80端口导致web程序无法启动

背景 linux系统内安装了例如nginx的网站程序&#xff0c;但是无法正常启动&#xff0c;netstat 查看下 80端口被 systemd 占用。 处理方法 注意务必组好快照备份后再操作。 做好备份后将/usr/lib/systemd/system 内http相关的配置文件重命名后重启主机恢复正常。 重启后正常 sy…