本文主要介绍如何使用WebSocket实现服务端和客户端之间的通信,以及如何在Node.js服务端和Vue客户端之间建立WebSocket连接。
背景
在项目开发中,有一个’实时报警弹窗‘的需求,顾名思义要做到’实时‘二字。之前碰到此类问题都是一个定时器定时向后台请求获取数据,可这次得由后台主动推送,这就不得不用到WebSocket了。
我猜一定有跟我一样初出茅庐的小伙伴都听说过此项技术,却从来没想了解过,突然之间不知如何下手。
因为目前还没接触过,导致也没有和服务端匹配过。最开始的也不知道是怎样匹配,逛遍各大博客网站全都是错综且复杂的案例,好生让人眼花缭乱。最后查阅了MDN官方文档才慢慢摸索出来一些。
WebSocket简介
WebSocket是一种在单个TCP连接上进行全双工通信的协议。它使得客户端和服务端之间的数据交换变得更加简单、高效,而无需像HTTP协议那样进行频繁的请求和响应。
在WebSocket中,客户端和服务端之间可以随时发送数据,并且可以同时接收对方发送的数据。当有新的消息到达时,WebSocket会触发相应的事件,从而使得客户端和服务端之间的通信变得实时、高效。
使用WebSocket实现实时通信
在Node.js服务端项目中,可以使用ws包来实现WebSocket服务端。在Vue客户端项目中,可以使用websocket包来实现WebSocket客户端。
下面是一个简单的示例,演示了如何在Node.js服务端和Vue客户端之间建立WebSocket连接:
开始之前,我们需要先安装一些必要的包:
- 在Node.js服务端项目中,使用
npm或yarn安装ws包:npm install ws或yarn add ws - 在Vue客户端项目中,使用npm或yarn安装websocket包:
npm install websocket或yarn add websocket
服务端代码(Node.js)
const WebSocket = require('ws');
// 创建WebSocket服务器实例,监听指定端口
const wss = new WebSocket.Server({ port: 8080 });
// 监听连接建立事件
wss.on('connection', function connection(ws) {
console.log('WebSocket连接已建立');
// 监听收到客户端消息事件
ws.on('message', function incoming(message) {
console.log('收到客户端消息:', message);
// 向客户端发送消息
ws.send('Hello, client!');
});
// 监听连接关闭事件
ws.on('close', function close() {
console.log('WebSocket连接已关闭');
});
});
记得起一下服务,否则客户端得不到响应
客户端代码(Vue)
<template>
<div>
<button @click="connect">连接服务器</button>
<div v-if="connected">
<input v-model="message" placeholder="输入消息" />
<button @click="sendMessage">发送消息</button>
<p>{{ serverMessage }}</p>
</div>
</div>
</template>
<script>
import WebSocket from 'websocket';
export default {
data() {
return {
ws: null,
connected: false,
message: '',
serverMessage: '',
};
},
methods: {
connect() {
this.ws = new WebSocket('ws://localhost:8080');
this.ws.onopen = () => {
console.log('WebSocket连接已建立');
this.connected = true;
};
this.ws.onmessage = (event) => {
console.log('收到服务器消息:', event.data);
this.serverMessage = event.data;
};
this.ws.onclose = () => {
console.log('WebSocket连接已关闭');
this.connected = false;
};
},
sendMessage() {
this.ws.send(this.message);
this.message = '';
},
},
};
</script>
运行客户端之后
点击
连接服务器之后可以看到
服务端也在做相应的响应
在上述示例中,我们使用ws包创建WebSocket服务器实例,并在连接建立、收到消息、连接关闭等事件中分别处理相应的逻辑。在Vue客户端中,我们使用websocket包创建WebSocket客户端实例,并在连接建立、收到消息、连接关闭等事件中分别处理相应的逻辑。通过这样的方式,我们就可以在Node.js服务端和Vue客户端之间建立WebSocket连接,并实现实时通信的功能。
附上html格式
下面是一个简单的HTML页面示例,展示了如何使用JavaScript和WebSocket库来实现客户端与服务端之间的通信:
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>WebSocket示例</title>
</head>
<body>
<div>
<button onclick="connect()">连接服务器</button>
<div id="message-container" style="display: none;">
<input id="message-input" placeholder="输入消息" />
<button onclick="sendMessage()">发送消息</button>
<p id="server-message"></p>
</div>
</div>
<script>
// 创建WebSocket实例
const ws = new WebSocket('ws://localhost:8080');
// 监听连接建立事件
ws.addEventListener('open', () => {
console.log('WebSocket连接已建立');
document.getElementById('message-container').style.display = 'block';
});
// 监听收到服务器消息事件
ws.addEventListener('message', (event) => {
console.log('收到服务器消息:', event.data);
document.getElementById('server-message').textContent = event.data;
});
// 监听连接关闭事件
ws.addEventListener('close', () => {
console.log('WebSocket连接已关闭');
document.getElementById('message-container').style.display = 'none';
});
// 连接服务器
function connect() {
ws.connect();
}
// 发送消息
function sendMessage() {
const messageInput = document.getElementById('message-input');
const message = messageInput.value;
ws.send(message);
messageInput.value = '';
}
</script>
</body>
</html>