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 中看到消息推送,当客户端和服务端建立连接之后,客户端可以向服务端发送消息,服务端也可以向客户端推送消息,实现即时通信功能。如下图:

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

社会工程渗透测试教程(四)

原文&#xff1a;annas-archive.org/md5/db987a87e1478b8a8617c263c631b477 译者&#xff1a;飞龙 协议&#xff1a;CC BY-NC-SA 4.0 第十三章&#xff1a;撰写报告 安德鲁梅森&#xff0c;技术总监&#xff0c;RandomStorm 有限公司 本章将介绍向客户提供的主要成果&#xf…

嵌入式物联网实战开发笔记-乐鑫ESP32开发环境ESP-IDF搭建【doc.yotill.com】

乐鑫ESP32入门到精通项目开发参考百例下载&#xff1a; 链接&#xff1a;百度网盘 请输入提取码 提取码&#xff1a;4e33 3.1 ESP-IDF 简介 ESP-IDF&#xff08;Espressif IoT Development Framework&#xff09;是乐鑫&#xff08;Espressif Systems&#xff09;为 ESP 系列…

FineBi中创建自定义的图表

FineBi中增加自己的自定义图表组件,比如: 的相关笔记: 1 获取有哪些BI自定义图表组件:http://localhost:8080/webroot/decision/v5/plugin/custom/component/list?_=1713667435473[{"name": "图表DEMO_EK","chartType": "amap_demo&q…

LinkedList和链表

1.ArrayList的缺陷 ArraryList由于底层是一段连续的空间&#xff0c;所以在ArrayList任意位置插入或者删除元素时&#xff0c;就 需要将后续元素往前或者往后搬移&#xff0c;时间复杂度为O(n)&#xff0c;效率比较低&#xff0c;因此ArrayList不适合做任意位置插入和删除比较…

rmallox勒索病毒威胁网络安全:如何避免数据被锁定

尊敬的读者&#xff1a; 随着信息技术的飞速发展&#xff0c;网络空间的安全问题日益凸显。近年来&#xff0c;一种名为.rmallox的勒索病毒频繁出没&#xff0c;给广大计算机用户带来了严重的困扰。本文将对该病毒进行深入剖析&#xff0c;并探讨相应的应对策略。在面对被勒索…

十大排序算法详解-上篇:比较排序算法【python 动态图解】

作者介绍&#xff1a;10年大厂数据\经营分析经验&#xff0c;现任大厂数据部门负责人。 会一些的技术&#xff1a;数据分析、算法、SQL、大数据相关、python 欢迎加入社区&#xff1a;码上找工作 作者专栏每日更新&#xff1a; LeetCode解锁1000题: 打怪升级之旅 python数据分析…

11.接口自动化学习-Yaml学习

1.配置文件作用 配置文件项目角度&#xff1a; &#xff08;1&#xff09;现成的应用–第三方组件 mysql–数据库–my.conf tomcat–web服务器–server.xml 修改&#xff1a;连接数/端口 redis–缓存服务器–redis.conf 修改配置 jemeter–压测工具–jemeter.properties–修改…

【探讨】RocketMQ消息灰度方案-消息逻辑隔离

vivo 鲁班平台 RocketMQ 消息灰度方案 - 稀土掘金分布式- vivo鲁班RocketMQ平台的消息灰度方案MQ消息在生产环境和灰度环境隔离一般怎么实现?消息隔离的原则 中心正常消费者,可以同时消费正常的消息和特定标签的消息(自动识别);特定标签的消费者,只能消费特定标签的消息。灰…

【Linux 进程间通信】管道(三)

文章目录 1.管道的五种特征2.管道的四种情况 1.管道的五种特征 ①&#x1f34e;匿名管道只能用于有血缘关系的进程之间进行通信&#xff08;爷孙进程之间可以进行通信&#xff09;&#xff0c;常用于父子之间进行通信&#xff1b; ②&#x1f34e;管道内部&#xff0c;自带进…

【独家】万字长文带你梳理Llama开源家族:从Llama-1到Llama-3

Datawhale干货 作者&#xff1a;张帆&#xff0c;陈安东&#xff0c;Datawhale成员 引言 在AI领域&#xff0c;大模型的发展正以前所未有的速度推进技术的边界。 北京时间4月19日凌晨&#xff0c;Meta在官网上官宣了Llama-3&#xff0c;作为继Llama-1、Llama-2和Code-Llama之后…

ExpertPrompting:指导大语言模型成为杰出专家

&#x1f349; CSDN 叶庭云&#xff1a;https://yetingyun.blog.csdn.net/ 论文标题&#xff1a;ExpertPrompting: Instructing Large Language Models to be Distinguished Experts 论文地址&#xff1a;https://arxiv.org/abs/2305.14688 作者 & 机构&#xff1a;Benfen…

MySQL基础篇总结

参考&#xff1a;黑马程序员MySQL基础视频链接 数据库基本操作 启动与停止 1.第一种方式&#xff1a; 1>以管理员身份运行cmd 2>在命令行窗口中输入: 启动:net start mysql80停止:net stop mysql80 2.第二种方式: 1>WinR快捷方式打开如下&#xff1a; 输入&#…