nestjs-websocket 实现简单的聊天室

该博客展示了如何利用NestJS框架创建一个WebSocket服务器,实现用户连接、断开时的消息广播,以及监听和处理客户端发送的'message'和'name'事件。代码中包含了WebSocket的初始化、连接管理和消息传递等功能。
摘要由CSDN通过智能技术生成

https://www.passerma.com/chat/

代码地址 https://github.com/passerma/nestjs-websocket

websocket部分代码如下

import {
  OnGatewayConnection, OnGatewayInit, SubscribeMessage, WebSocketGateway, OnGatewayDisconnect, WebSocketServer
} from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';
import { Logger } from '@nestjs/common';

@WebSocketGateway({
  path: '/socket',
  allowEIO3: true,
  cors: {
    origin: /.*/,
    credentials: true
  }
})
export class AppGateway implements OnGatewayInit, OnGatewayConnection, OnGatewayDisconnect {
  private logger: Logger = new Logger('ChatGateway');
  @WebSocketServer() private ws: Server;  // socket实例
  private connectCounts = 0               // 当前在线人数
  private allNum = 0                      // 全部在线人数
  private users: any = {}                 // 人数信息

  /**
   * 初始化
   */
  afterInit() {
    this.logger.log('websocket init ...');
  }

  /**
   * 链接成功
   */
  handleConnection(client: Socket) {
    this.connectCounts += 1
    this.allNum += 1
    this.users[client.id] = `user-${this.connectCounts}`
    this.ws.emit('enter', { name: this.users[client.id], allNum: this.allNum, connectCounts: this.connectCounts });
    client.emit('enterName', this.users[client.id]);
  }

  /**
   * 断开链接
   */
   handleDisconnect(client: Socket) {
    this.allNum -= 1
    this.ws.emit('leave', { name: this.users[client.id], allNum: this.allNum, connectCounts: this.connectCounts  });
  }

  @SubscribeMessage('message')
  /** 
   * 监听发送消息
  */
  handleMessage(client: Socket, data: any): void {
    this.ws.emit('message', {
      name: this.users[client.id],
      say: data
    });
  }

  @SubscribeMessage('name')
  /** 
   * 监听修改名称
  */
  handleName(client: Socket, data: any): void {
    this.users[client.id] = data
    client.emit('name', this.users[client.id]);
  }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值