这两个 可是不能同时使用的呢

这两个 可是不一样的呢

可以理解成 socket.io 是在 websocket 上面封装了一层 并提供了 断开重连 心跳事件 等等

websocket

route

1
app.ws.route('/ws', controller.ws.index.start)

使用方式

this.app.wsthis.ctx.websocket 情况大部分相似 区别于 具体命令

1
2
3
4
5
6
7
8
9
10
11
12
13
// 给自己发消息
this.ctx.websocket.send()

// 加入房间
this.ctx.websocket.room.join('room_id')

// 离开房间
this.ctx.websocket.room.leave('room_id')

// 给 room_id 房间 发送消息
this.app.ws.sendJsonTo('room_id', {
body: 'hello websocket',
})

socket.io

route

1
2
const { io } = app
io.of('/').route('start', io.controller.index.start)

namespace

1
2
3
4
5
6
7
8
9
namespace: {
// 命名空间
'/': {
// 首次连接中间件
connectionMiddleware: [],
// 每次消息中间件
packetMiddleware: [],
},
},

使用方式

this.app.iothis.ctx.socket 情况大部分相似 区别于 有没有上下文

  • 此上下文指 是不是由 socket.io 触发的事件
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 加入房间
this.ctx.socket.join('room_id')
// 离开房间
this.ctx.socket.leave('room_id')

// 给 当前连接的用户 发送 hello 事件 的消息
this.ctx.socket.emit('hello', {
body: 'hello',
})

// 给 room_id 房间 发送 hello 事件 的消息
this.ctx.socket.to('room_id').emit('hello', {
body: 'hello socket',
})

// egg schedule socket
this.app.io.of('/').to('room_id').emit('hello', {
body: 'hello socket no trigger',
})