--- description: 即时通讯(Socket) globs: --- # 即时通讯(Socket) `cool-admin`即时通讯功能基于[Socket.io(v4)](https://socket.io/docs/v4)开发,[midwayjs 官方 Socket.io 文档](http://midwayjs.org/docs/extensions/socketio) ## 配置 `configuration.ts` ```ts import * as socketio from "@midwayjs/socketio"; @Configuration({ imports: [ // socketio http://www.midwayjs.org/docs/extensions/socketio socketio, ], importConfigs: [join(__dirname, "./config")], }) export class ContainerLifeCycle { @App() app: koa.Application; async onReady() {} } ``` ## 配置`config/config.default.ts` 需要配置 redis 适配器,让进程之间能够进行通讯 ```ts import { CoolConfig, MODETYPE } from "@cool-midway/core"; import { MidwayConfig } from "@midwayjs/core"; import * as fsStore from "@cool-midway/cache-manager-fs-hash"; import { createAdapter } from "@socket.io/redis-adapter"; // @ts-ignore import Redis from "ioredis"; const redis = { host: "127.0.0.1", port: 6379, password: "", db: 0, }; const pubClient = new Redis(redis); const subClient = pubClient.duplicate(); export default { // ... // socketio socketIO: { upgrades: ["websocket"], // 可升级的协议 adapter: createAdapter(pubClient, subClient), }, } as MidwayConfig; ``` ## 服务端 ```ts import { WSController, OnWSConnection, Inject, OnWSMessage, } from "@midwayjs/core"; import { Context } from "@midwayjs/socketio"; /** * 测试 */ @WSController("/") export class HelloController { @Inject() ctx: Context; // 客户端连接 @OnWSConnection() async onConnectionMethod() { console.log("on client connect", this.ctx.id); console.log("参数", this.ctx.handshake.query); this.ctx.emit("data", "连接成功"); } // 消息事件 @OnWSMessage("myEvent") async gotMessage(data) { console.log("on data got", this.ctx.id, data); } } ``` ## 客户端 ```ts const io = require("socket.io-client"); const socket = io("http://127.0.0.1:8001", { auth: { token: "xxx", }, }); socket.on("data", (msg) => { console.log("服务端消息", msg); }); ``` ## 注意事项 如果部署为多线程的,为了让进程之间能够进行通讯,需要配置 redis 适配器,[配置方式](http://midwayjs.org/docs/extensions/socketio#%E9%85%8D%E7%BD%AE-redis-%E9%80%82%E9%85%8D%E5%99%A8) ```ts // src/config/config.default import { createRedisAdapter } from "@midwayjs/socketio"; export default { // ... socketIO: { adapter: createRedisAdapter({ host: "127.0.0.1", port: 6379 }), }, }; ```