websocket和SSE通信示例(无需安装任何插件)
2023-12-14 20:36:59
websocket和SSE通信示例(无需安装任何插件)
源码示例(两种方案任意切换)
data(){
return {
heartBeatInterval:5000,// 心跳间隔时间,单位为毫秒
webSocket:null,
heartBeatTimer:null,
}
},
mounted() {
// this.initWebSocket();//方案1,全双工通信websocket,部署线上后要使用wss,要求线上是域名且为https
this.createSseConnect();//方案2,sse,单工通信(http长连接)
},
methods:{
// sse建立连接
createSseConnect(){
let self = this;
if(window.EventSource){
const eventSource = new EventSource(`${this.$sseUrl}/sse/createConnect?clientId=${this.$store.state.user.name}`);
eventSource.onmessage = (e) =>{
console.log("msg info:", e.data);
self.handleMessage(JSON.parse(e.data))
};
eventSource.onopen = (e) =>{
console.log("已建立连接~")
};
eventSource.onerror = (e) =>{
if (e.readyState == EventSource.CLOSED) {
console.log("连接关闭");
} else if (eventSource.readyState == EventSource.CONNECTING) {
console.log("正在重连");
} else {
console.log('error', e);
}
};
eventSource.close = (e) =>{
console.log("连接关闭");
};
}else{
console.log("你的浏览器不支持消息通信~")
}
console.log(" 测试 打印")
},
handleMessage(data) {
this.msgContent = data.messageTitle;
this.messageId = data.messageId;
this.newMsgCount = data.newInfoCount;
if(this.msgContent){
this.showMessagePop = true;
}
},
initWebSocket() {
this.webSocket = new WebSocket(`${this.$websocketUrl}/websocket/${this.$store.state.user.name}`);
this.webSocket.onopen = () => {
// 建立连接后开始发送心跳包
this.startHeartBeat();
};
this.webSocket.onmessage = (event) => {
// 处理服务器发送的消息
this.handleMessage(JSON.parse(event.data))
};
this.webSocket.onclose = () => {
console.log('WebSocket连接已关闭');
// 连接关闭后停止心跳包
this.stopHeartBeat();
// 可根据需要重新连接
// reconnect();
};
},
startHeartBeat() {
// 每隔一段时间发送心跳包
this.heartBeatTimer = setInterval(() => {
if (this.webSocket.readyState === this.webSocket.OPEN) {
this.webSocket.send('hello,这是一个心跳包'); // 发送心跳包
}
}, this.heartBeatInterval);
},
stopHeartBeat() {
// 停止心跳包发送
clearInterval(this.heartBeatTimer);
},
}
注意事项
使用websocket要注意
- websocket一段时间后会自动关闭链接,所以要定时发送心跳包请求检测心跳以保证链接持续有效
- 在vue项目中配置代理时要注意target地址是ws协议的
target: 'ws://x.x.x.x:8080',
- websocket打包部署线上必须走wss,这就要求线上域名为https请求
使用SSE要注意
1.当确认请求地址无误,postman也可以请求通,但是唯独在项目中请求一直pending时,前端可以在devServer中配置compress:false,
参数来解决。
2.当本地请求正常,部署到线上之后就一直请求超时,statuscode栏显示已屏蔽mixed-content
,让后端在nginx配置中加上buffer相关的配置即可
文章来源:https://blog.csdn.net/hahaha113461/article/details/134928124
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!