2025-02-09 21:02:47 +08:00

128 lines
2.5 KiB
Plaintext

---
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 }),
},
};
```