广播 Broadcasting events

广播可以向除发送者外的所有连接的客户端发送消息

可以通过 BroadcastToRoom 广播给房间里面的用户,可以在 connect 阶段默认设置一个房间,则可以广播给所有连接的用户

server.OnConnect("/", func(s socketio.Conn) error {
	s.SetContext("")
	fmt.Println("connected:", s.ID())
	s.Join("bcast") // 加入房间
	return nil
})

广播也适用于多个 Socket.IO 服务器。

您只需将默认适配器替换为Redis 适配器或其他兼容的适配器

房间机制 Rooms

如果需要广播给指定用户,则可以使用 Rooms,sockets可以join 和 leave房间。它可用于向一部分客户端广播事件

代码示例

// 监听 join_rooms 事件
server.OnEvent("/", "join_rooms", func(s socketio.Conn, msg string) {
	s.Join("ryan_rooms")
	server.BroadcastToRoom("", "ryan_rooms", "join_rooms", s.ID()+" join ryan_rooms") // 广播给所有用户
	fmt.Println(s.ID()+"加入房间 ", msg)
})

实时更新

结合 redis pub sub 发布订阅机制,可以实现无状态的多实例实时更新,实际使用还需要结合 login 等权限校验机制确保业务安全。

以页面实时获取后端数据为例,用户打开页面,建立 websocket 连接后,默认订阅room_id “liveUpdate”

然后使用 redis 的 pub sub 机制,后端订阅频道,并且将数据广播到对应房间,有数据进来就发送到对应的 redis 频道

详细代码:

https://github.com/zhengjianhong001/go-websocket-live-update