websocket前端用node.js写服务端,本地调用

318 阅读1分钟

20241107_103057.gif

1. 服务端

1.新建一个server.js文件

2.初始化一个node项目

npm init -y

3.使用npm安装ws库

npm install ws

4.使用nodejs

const WebSocket = require("ws");
// 创建一个 WebSocket 服务器,监听端口 3000
const wss = new WebSocket.Server({ port: 3000 });
// 监听连接事件
wss.on("connection", function connection(ws) {
  console.log("客户端已连接");
  // 监听客户端发送的消息
  ws.on("message", function incoming(message) {
    console.log("收到消息", message.toString());
    // 原样将消息发送回客户端
    ws.send("服务端返回" + message.toString());
  });
  //模仿服务端流式数据持续推送
  setInterval(() => {
    let date = new Date();
    ws.send("主动推送的消息" + date);
  }, 1000);
  // 监听连接关闭事件
  ws.on("close", function () {
    console.log("客户端断开连接");
  });
});

5.在终端中运行命令启动ws服务

node server.js
  1. 看到以下输出,证明服务已经启动
WebSocket server is running on ws://localhost:3000

2.客户端

使用html写一个页面或者用vue写一个页面连接ws

<template>  
  <div id="app">  
    <h1>WebSocket Demo</h1>  
    <input type="text" v-model="message" placeholder="发送消息" />  
    <button @click="sendMessage">发送</button>  
    <button @click="disconnectWebSocket">关闭连接</button>  
    <button @click="connectWebSocket">连接</button>  
    <button @click="clear">清空</button>  
    <ul style="height: 400px;overflow: auto;width: 600px;" >  
      <li v-for="(msg,index) in messages" :key="index"> {{messages.length - index}} {{ msg }}</li>  
    </ul>  
  </div>  
</template>  
<script>  
export default {  
  name: 'App',  
  data() {  
    return {  
      socket: null,  
      message: '',  
      messages: []  
    }  
  },  
  mounted() {  
    this.connectWebSocket()  
  },  
  beforeUnmount() {  
    this.disconnectWebSocket()  
  },  
  methods: {
    clear(){
      this.messages = []
    },
    connectWebSocket() {  
      this.socket = new WebSocket('ws://localhost:3000')  
      this.socket.addEventListener('open', () => {  
        console.log('服务端已连接')  
      })  
      this.socket.addEventListener('message', (event) => {  
        console.log('收到信息', event.data)  
        this.displayMessage(event.data)  
      })  
      this.socket.addEventListener('error', (event) => {  
        console.error('WebSocket 连接出错:', event)  
        // this.reconnectWebSocket()  
      })  
      this.socket.addEventListener('close', () => {  
        console.log('WebSocket 连接已关闭')  
        // this.reconnectWebSocket()  
      })  
    },  
    disconnectWebSocket() {  
      if (this.socket) {  
        this.socket.close()  
        this.socket = null  
      }  
    },  
    reconnectWebSocket() {  
      setTimeout(() => {  
        this.connectWebSocket()  
      }, 5000) // 5 秒后重新连接  
    },  
    displayMessage(message) {  
      this.messages.unshift(message)  
    },  
    sendMessage() {
      if (this.socket && this.socket.readyState === WebSocket.OPEN) {  
        this.socket.send(this.message)  
        this.message = ''  
      } else {
        console.error('WebSocket 连接未建立或已关闭')  
      }  
    }  
  }  
}  
</script>