005利用Socket.io实现Node.js后端服务与Web前端实时交互的功能

注意:这里使用的http来创建,以便实现将WS服务以相同的地址和端口集成到Web服务中。
摘要由CSDN通过智能技术生成

005利用Socket.io实现Node.js后端服务与Web前端实时交互的功能

采用http创建Node.js的服务

注意:这里使用的http来创建,以便实现将WS服务以相同的地址和端口集成到Web服务中

// nodejs启动http服务
const http = require('http');
const Server = http.createServer(app.callback());

基于http的Server,建立WebSocket服务

// 将WS服务以相同的地址和端口集成到Web服务中
const Socket = require('socket.io'); // 引入ws服务
// 基于http的Server,建立WebSocket服务
const ws = Socket(Server, {
   
  allowEIO3: true, // 是否启用与V2版本的客户端兼容,默认是false
  // cors:true, // 开放跨域,官方文档:https://socket.io/docs/v4/server-options/#cors
  cors: {
   
    origin: '*', // 支持单个网址,或网址的数组
    methods: ['GET', 'POST', 'PUT'], // 请求方式
  },
});

监听到用户连接上来,开始处理

// 储存当前连接的用户id列表,该id由socket.id自动生成
const sockets: any[] = [];
// 监听到有用户连接上来了!
ws.on('connection', (socket: any) => {
   
  console.log(666.301, 'connection', socket.id);
  // 将A用户id加入用户列表
  sockets.push(socket.id);
  // 对外广播有A用户连接上来了,注意:这里使用ws
  ws.emit('msg-broadcast', {
    msg: `欢迎,${
     socket.id}`, users: sockets });
  // 监听A用户发过来的消息
  socket.on('msg-client', (msg: string) => {
   
    console.log(666.301, 'msg-client', msg);
    // 将A用户发过来的消息封装一下再回传给用户,注意:这里使用socket
    socket.emit('msg-server', {
    msg, tm: new Date() }, (res: any) => {
   
      // 增加第三个回调函数变量是为了获取A用户拿到消息后的回答信息
      console.log(666.303, 'msg-server', res);
    });
  });
  // 监听A用户主动来拉取服务器信息,如用户列表信息
  socket.on('msg-fetch', (msg: string) => {
   
    console.log(666.309, 'msg-fetch', msg);
    // 回应A用户的请求
    socket.emit('msg-fetch-server', {
    msg, tm: new Date(), fetch: sockets });
  });
  // 当A用户离开(断开连接)的时候
  socket.on('disconnect', () => {
   
    console.log(666.305, 'disconnect', socket.id);
    // 将用户从服务器端的用户列表中删除
    sockets.splice(
      sockets.findIndex((el) => el === socket.id),
      1
    );
    // 将A用户离开的消息发送给所有在线连接的用户
    ws.emit('msg-broadcast', {
    msg: `${
     socket.id},再见`, users: sockets });
  });
});

实现服务器心跳广播的功能

// 这里演示一个服务器心跳广播的功能
let indexNum: number = 1;
setInterval(() => {
   
  indexNum++;
  // 所有在线的用户均可收到该广播
  ws.emit('msg-index', indexNum);
}, 1000);

客户端初始化WS服务并连接

import {
    io } from 'socket.io-client'; // 引入ws客户端插件
const ws = io('ws://127.0.0.1:9098'); // 建立与服务器端的ws服务

// 初始化ws服务
function wsInit() {
   
  // 监听到我连接到了ws服务
  ws.on('connect', () => {
   
    console.log(666.601, 'connect');
  });
}

客户端发送消息

const msgClient = ref
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿赛工作室

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值