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>

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

发送 ```

相关推荐
Csvn8 小时前
WASM
前端
修己xj10 小时前
我用 AI 给自己写了一个 Markdown 编辑器,然后把它开源了
前端
FRing0310 小时前
vue2干货总结2(v-bind、v-for、v-model、指令修饰符、v-bind操作class和style)
开发语言·前端·vue.js·vue2
幸运小猿10 小时前
模拟慢上传-处理超时重试image 丢失线上问题
前端·javascript·html
moshuying12 小时前
网购能买Token了!
前端
h_654321012 小时前
echarts实现柱状图加一条横线
前端·echarts
风骏时光牛马12 小时前
生成一个后端标题,只需要一个标题,不需要其他的任何文本。
前端
子非鱼@Itfuture12 小时前
关于前后端联调中登录状态/登录信息失效?
java·前端
郭小李12 小时前
openFeign入门
java·开发语言·前端
馒头不想说话12 小时前
AI当运营,帮你省人力
前端