socket.io
首先介绍一下socket.io吧。
socket.io
是一个用于实现实时通信的JavaScript库。它可以在浏览器和服务器之间实现双向通信,支持多种传输协议,如WebSocket、LongPolling、XHR等。socket.io
的主要目的是为了简化实时通信在浏览器和服务器之间的实现,使得开发者可以专注于业务逻辑的实现。
socket.io
的主要特点包括:
- 支持多种传输协议:
socket.io
支持WebSocket、LongPolling、XHR等传输协议,可以根据浏览器和服务器的支持情况自动选择合适的传输协议。 - 自动重连:
socket.io
会自动检测连接断开的情况,并在适当的时候尝试重新连接。 - 消息压缩:
socket.io
支持对发送的消息进行压缩,以减少传输的数据量。 - 错误处理:
socket.io
提供了丰富的错误处理机制,可以捕获并处理客户端和服务器之间的错误。 - 事件机制:
socket.io
使用事件机制来处理消息,使得代码更加简洁和易于维护。
总之,socket.io
是一款功能强大、易于使用的实时通信库,可以帮助开发者轻松实现浏览器和服务器之间的实时通信。
Nest具体实现
首先需要安装依赖
npm install @nestjs/platform-socket.io
npm install @nestjs/websockets
新建一个文件用来接受广播消息和发送消息
events.gateway.ts
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59
| import { ConnectedSocket, MessageBody, SubscribeMessage, WebSocketGateway, WebSocketServer, } from '@nestjs/websockets'; import { Server,Socket } from 'socket.io';
@WebSocketGateway({ cors: { origin: '*' } }) export class EventGateway { constructor() {} @WebSocketServer() server: Server;
@SubscribeMessage('newMessage') handleMessage(@MessageBody() body: any, @ConnectedSocket() client: Socket) { console.log(body); const msg: any = {}; const { roomId, name,message } =body || {} msg.text = message msg.name = name msg.roomId = roomId this.server.to(roomId).emit('newMessage', msg) } @SubscribeMessage('leave') handleLeave(@MessageBody() body: any, @ConnectedSocket() client: Socket) { const { roomId, name } =body || {} this.server.to(roomId).emit('leave', `用户:${name}离开了房间 ${roomId}`); client.leave(roomId); } @SubscribeMessage('join') handleJoin(@MessageBody() body: any, @ConnectedSocket() client: Socket) { const { roomId, name } =body || {} client.join(roomId); this.server.to(roomId).emit('join', `用户:${name}加入了房间 ${roomId}`); }
@SubscribeMessage('getRoomUsers') handleGetRoomUsers(@MessageBody() body: any, @ConnectedSocket() client: Socket) { const room = this.server.sockets.adapter.rooms.get(body.roomId); if (room) { this.server.to(body.roomId).emit('getRoomUsers', room.size); } else { this.server.to(body.roomId).emit('getRoomUsers', 0); } } }
|
在app.module.ts中
1
| import { EventGateway } from './events/events.gateway';
|
在providers中注入该服务
启动项目 yarn start
前端实现逻辑
安装依赖: npm install socket.io-client
先连接上socket.io
1 2 3
| import { io } from "socket.io-client"; const URL ='socket.io的地址' const socket = io(URL);
|
socket.emit 发送消息
socket.on 监听消息
例如创建或加入房间 (nest代码中join事件,客户端这边连接上了socket.io,就可以通过对应事件实现双向通讯了)
1 2 3
| const createOrJoinRoom = () => { socket.emit("join", { roomId: props.state.roomId, name: props.state.name }); }
|
监听加入房间的事件,看看服务端回应广播的消息
1 2 3
| socket.on('join', (e) => { console.log(e) });
|
其他的离开房间,发送消息等类似加入房间,具体可看源码
实现效果
前端样式比较简单具体实现效果如下:
体验地址
http://zymanage.yaoyaoqiekenao.com/
源码地址
https://github.com/DarknessZY/my-blog-app-nest.git