WebSocket 是一种基于 TCP 的协议,它提供了双向实时通信的能力。相比传统的 HTTP 协议,WebSocket 具有更低的延迟和更高的性能。以下是 WebSocket 的一些特点和优势:
- 双向通信:WebSocket 允许客户端和服务器之间进行双向通信,可以在任何一方发送消息而无需等待请求和响应的过程。
- 持久连接:WebSocket 连接会在客户端和服务器之间保持长时间打开,与传统的 HTTP 请求/响应模型不同,不需要每次通信都建立新的连接。
- 较低的延迟:由于持久连接和双向通信的特性,WebSocket 提供了较低的延迟,可以更快地进行实时通信。
- 更少的数据开销:WebSocket 使用二进制数据格式进行通信,相对于传统的基于文本的 HTTP 通信,它可以减少数据传输的开销。
- 跨域支持:WebSocket 支持跨域通信,使得客户端能够与不同域名下的服务器进行实时通信。
- 灵活性和扩展性:WebSocket 具有灵活的握手协议,可以进行自定义的握手过程,并且支持扩展协议,可用于满足特定应用需求。
WebSocket 协议包含了一个标准化的握手过程,通过 HTTP 协议进行升级请求,一旦握手成功,连接将升级到 WebSocket,之后的通信交换将遵循 WebSocket 协议规范。
在 Web 开发中,你可以使用 JavaScript 的 WebSocket API 在浏览器中创建 WebSocket 客户端。对于服务器端,有许多编程语言和框架提供了对 WebSocket 的支持。
总结一下,WebSocket 提供了一种简单、高效且实时的双向通信方式,使得客户端和服务器能够实时地交换数据,广泛应用于实时聊天、在线游戏、股票行情、推送通知等领域。
在 NestJS 中使用 WebSocket,你可以使用 @nestjs/websockets 模块来实现实时双向通信。下面是使用 WebSocket 的详细介绍:
安装 @nestjs/websockets 模块:使用 npm 或者 yarn 安装 @nestjs/websockets 模块。
npm install --save @nestjs/websockets
创建 WebSocket 模块:在你的 NestJS 应用中创建一个 WebSocket 模块,用于处理 WebSocket 相关的逻辑。创建一个新的文件,命名为 websocket.module.ts
。
import { Module } from '@nestjs/common'; import { WebSocketGateway } from '@nestjs/websockets'; import { AppGateway } from './app.gateway'; @WebSocketGateway() export class WebSocketModule {} @Module({ imports: [WebSocketModule], providers: [AppGateway], }) export class AppModule {}
在这个示例中,我们创建了 WebSocketModule 并通过 @WebSocketGateway() 装饰器将其标记为 WebSocket 网关。AppGateway 是一个 WebSocket 网关的类,我们稍后会实现它。
实现 WebSocket 网关:在 app.gateway.ts 文件中实现 WebSocket 网关。WebSocket 网关负责处理客户端与服务器之间的实时通信。
import { WebSocketGateway, WebSocketServer, OnGatewayConnection, OnGatewayDisconnect } from '@nestjs/websockets'; import { Server } from 'socket.io'; @WebSocketGateway() export class AppGateway implements OnGatewayConnection, OnGatewayDisconnect { @WebSocketServer() server: Server; handleConnection(client: any) { console.log('New client connected'); } handleDisconnect(client: any) { console.log('Client disconnected'); } }
在这个示例中,我们实现了 OnGatewayConnection 和 OnGatewayDisconnect 接口,分别处理客户端连接和断开连接的事件。@WebSocketServer() 装饰器用于将 server 属性绑定到 WebSocket 服务器对象上。
处理 WebSocket 消息:在 app.gateway.ts 中添加处理 WebSocket 消息的方法。
@WebSocketGateway() export class AppGateway implements OnGatewayConnection, OnGatewayDisconnect { // ... @SubscribeMessage('message') handleMessage(client: Socket, payload: any): string { const message = `Received message: ${payload}`; this.server.emit('message', message); return message; } }
在这个示例中,我们使用 @SubscribeMessage() 装饰器来定义一个处理名为 'message' 的消息的方法。当客户端发送 message 消息时,会触发 handleMessage() 方法,并将接收到的消息发送给所有连接的客户端。
使用 WebSocket 网关:在需要使用 WebSocket 功能的控制器、服务或模块中注入 AppGateway 并使用它。
@Controller() export class AppController { constructor(private readonly appGateway: AppGateway) {} @Get() sendMessage(): string { this.appGateway.server.emit('message', 'Hello client!'); return 'Message sent'; } }
在这个示例中,我们在控制器中注入了 AppGateway,并创建了一个简单的路由来发送消息给连接的客户端。
现在,你可以启动 NestJS 应用程序,并使用 WebSocket 客户端与服务器进行实时通信。可以通过访问 http://localhost:3000 来访问你的应用程序,并使用 WebSocket 连接进行实时交互。