nest.js websocket 群聊----私聊功能

php 复制代码
import {Module} from "@nestjs/common";
import { EventsGateway } from "./events.gateway";
@Module({
  imports:[],
  controllers:[],
  providers:[EventsGateway],
  exports:[]
})
export  class websocketModule {
  
}

核心逻辑

less 复制代码
import {WebSocketGateway,SubscribeMessage,MessageBody,ConnectedSocket,WebSocketServer,  OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect,} from "@nestjs/websockets";
import { Server, Socket } from 'socket.io';




@WebSocketGateway()
export  class EventsGateway implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect{

  //给所有websocket客端发送信息
  @WebSocketServer()
  server: Server;


  /**
   * userId -> socketId
   */
  private userSocketMap = new Map<number, string>();

  /**
   * socketId -> userId
   */
  private socketUserMap = new Map<string, number>();



  //群聊
  @SubscribeMessage('events')
  handleEvent(@MessageBody() data: string,  @ConnectedSocket() client: Socket) {
     console.log("----------------------------",data,client.id)
    // 回复当前客户端
    // client.emit('events', {
    //    type:'client',
    //    message: data['message']
    // });

    //回复全部客户端包括自己
    // this.server.emit('events', {
    //   type:'client',
    //   message: data['message']
    // });

    // 广播给除了当前客户端之外的所有客户端
    client.broadcast.emit('events', {
      type: 'client',
      message: data['message']
    });
  }

  /**
   * 私聊
   */
  @SubscribeMessage('privateMessage')
  handlePrivateMessage(@MessageBody() data: any, @ConnectedSocket() client: Socket) {

    console.log("data>>>>",data.toUserId)
    /**
     * 当前发送者
     */
    const fromUserId =this.socketUserMap.get(client.id);

    /**
     * 接收者
     */
    const toUserId = Number(data.toUserId);

    //根据客户端发过来的toUserId(发给谁的toUserId)在找到 这个toUserId的 scoket.id
    const toSocketId=this.userSocketMap.get(toUserId);
    if(!toSocketId){
      client.emit('privateMessage',{
        message: '不在线',
        time: Date.now(),
      });
      return
    }


    /**
     * 发送给指定用户
     * 这个指的是  toSocketId  发给谁的 socket.id  通过传过来的 toUserId(发给谁的 id)在去查找 socket.id  拿到之后 传入this.server.to(XXX)
     */
    this.server.to(toSocketId).emit('privateMessage', {
      fromUserId,
   //   toUserId,
      message: data.message,
      time: Date.now(),

    });


  }






  afterInit(server: Server) {
    console.log('WebSocket 初始化完成');
  }


  handleConnection(client: Socket) {
//    console.log('客户端连接:', client.handshake);

    this.userSocketMap.set(Number(client.handshake.auth.userId),client.id);

    this.socketUserMap.set(client.id,client.handshake.auth.userId);
    // 广播给所有客户端  》》给所有websocket客端发送信息
    this.server.emit('server', {
      type:'server',
      message: `用户 ${client.handshake.auth.userId} 加入聊天室`
    });

  }

  handleDisconnect(client: Socket) {
    this.server.emit('server', {
      type:'server',
      message: `用户 ${client.id} 离开聊天室`
    });
    console.log('客户端断开:', client.id);
  }


}

html*
WebSocket 聊天室
×

欢迎回来

登录您的账号

xml 复制代码
<div class="field">
  <label>账号 / 邮箱</label>
  <input type="text" id="text" placeholder="请输入账号或邮箱" />
</div>
ini 复制代码
<button class="login-btn" id="loginBtn">登 录</button>

<div class="footer-links">
  <a href="#">忘记密码?</a>
  <a href="#">立即注册</a>
</div>

💬 聊天室
连接中...
⚡ 正在连接服务器...
欢迎来到聊天室!

发送 ```

相关推荐
子兮曰2 天前
jev-ultrafast 深度解析:7 秒订机票的浏览器 Agent 是如何炼成的
前端·后端·agent
子兮曰2 天前
Jev 爆发一周:7 秒 Agent 背后的 System One 生态与三场争议
前端·后端·ai编程
前端小万2 天前
写公众号赚了 3000 块后,我做了一款叫 "一键成稿" 的软件
前端·微信小程序
爱勇宝2 天前
ZCode 开源 24 小时:一份没有历史的账本,回答不了"有没有偷代码"
前端·后端·chatglm (智谱)
三十而立洋2 天前
Cookie 详解:从产生到安全,一次讲透
前端·javascript
卡布鲁2 天前
把一个 Vite + Vue3 应用塞进 qiankun (React + Umi3) 主站:十个坑的复盘
前端·javascript·react.js
汉堡大王95272 天前
Jev:不是聊天机器人, 而是一个智能 if 语句
前端·人工智能·后端
梦想很大很大2 天前
从运行事实到回归证据:Workrun 的 Telemetry 与 Evaluation 实践
前端·人工智能·后端
计算机魔术师2 天前
Meta Muse agent 接入 Shopify 的 Shop Pay 实现代理式购物
前端
沙蒿同学2 天前
我用 Go 搭了一条 AI Agent 流水线:从 1 张商品图到一整套淘宝详情页
前端·javascript·后端