<p align="center">
<img src="https://github.com/hulutech-web/goravel-socket/blob/master/images/icon.png?raw=true" width="300" />
</p>
Socket详情
案例教程(mqtt实时通信)教程
介绍
goravel框架推荐的高性能websocket扩展包,您的Star是我前进的动力!!!💪 链接
- 扩展包提供了通用的websocket整体解决方案,适合多场景,go语言的高性能特性,保证了该扩展的高效与性能。
- 本扩展旨在快速地在goravel框架中集成使用,通过简单的配置即可搭建出性能强劲,功能丰富的即时通信场景。
- 扩展提供了方便的websocket常用功能,包含注册systemId(系统id),绑定clientId(客户端ID),分组(客户端分组),发送消息到指定分组,发送消息给客户端等,发送消息到系统,消息中的业务数据开发者按需添加即可;
概念须知:
- systemId:系统id,用于区分不同系统,每个系统拥有一个systemId,系统id不能重复,任意值.
- groupId:分组id,用于区分不同分组,每个分组拥有一个groupId,分组id不能重复,任意值.
- clientId:客户端id,用于区分不同客户端,每个客户端拥有一个clientId,且有扩展自动分配.
- 关系:系统共三层结构,systemId包含groupId,groupId包含clientId.
说明:systemId可以有多个,groupId可以有多个,clientId可以有多个。
安装方式
go get -u github.com/hulutech-web/goravel-socket
使用说明
1、在goravel项目中的config目录下的app.go文件中的providers数组中添加
import Socket "github.com/hulutech-web/goravel-socket"
在providers数组中添加
&Socket.ServiceProvider{},
2、在goravel项目中的router目录下的web.go文件中添加
import "github.com/hulutech-web/goravel-socket/servers" func Web() { websocketHandler := &servers.Controller{} facades.Route().Get("/ws", websocketHandler.Run) go servers.Manager.Start() }
3、访问路径/ws
业务流程
1、注册大区,systemId,不能重复,随机值,需缓存
2、连接ws,需要携带systemId头信息,连接成功后返回clientId,缓存至本地(这个时候会出现:xxx上线了,xxx下线了),每上线一个人将该人的clientId存入本地缓存,方便随时根据client进行发送消息
3、绑定客户端到分组(房间),对战双方都需要绑定,其他业务逻辑自行解析,注意需要将字符串结构为json格式
4、发布使用手册资源socket.md
4.1、通过命令方式查看使用手册
go run . artisan vendor:publish --package=github.com/hulutech-web/goravel-socket
4.2、路由说明,将操作交给前端,通过http方式调用socket提供的api进行与客户端通信,routers/routers.go,路由中间件自行添加,默认使用jwt中间件
facades.Route().Prefix("/api").Middleware(Jwt()).Group(func(router route.Router) {
registerController := register.NewRegisterController()
sendToClientController := send2client.NewRegisterController()
sendToClientsController := send2clients.NewSend2ClientsController()
sendToGroupController := send2group.NewSend2GroupController()
bindToGroupController := bind2group.NewBind2GroupController()
getOnlinelistController := getonlinelist.NewGetOnlineController()
closeClientController := closeclient.NewCloseClientController()
getAllGroupHandler := getallgroup.NewGetAllGroupController()
router.Post("/register", registerController.Run) //注册大区
router.Post("/send_to_client", sendToClientController.Run) //发送消息给指定的客户端
router.Post("/send_to_clients", sendToClientsController.Run) //发送消息给指定的客户端(多个客户端)
router.Post("/send_to_group", sendToGroupController.Run) //发送消息给指定的分组
router.Post("/bind_to_group", bindToGroupController.Run) //绑定客户端到分组
router.Post("/get_online_list", getOnlinelistController.Run) //获取在线列表
router.Post("/close_client", closeClientController.Run) //关闭客户端
router.Post("/get_all_groups", getAllGroupHandler.Run) //获取所有分组
})
4.3、前端API接口提交规范(数据结构)
4.3.1、注册大区
type inputData struct {
SystemId string `json:"systemId" form:"systemId" validate:"required"`
}
4.3.2、绑定分组
type inputData struct {
ClientId string `json:"clientId" validate:"required"`
GroupName string `json:"groupName" validate:"required"`
UserId string `json:"userId"`
Extend string `json:"extend"` // 拓展字段,方便业务存储数据
}
4.3.3、获取分组
type inputData struct {
ClientId string `json:"clientId" validate:"required"`
UserId string `json:"userId"`
Extend string `json:"extend"` // 拓展字段,方便业务存储数据
}
4.3.4、获取在线用户列表
type inputData struct {
GroupName string `json:"groupName" validate:"required"`
Code int `json:"code"`
Msg string `json:"msg"`
Data interface{} `json:"data"`
}
4.3.5、发送消息给指定的客户端
type inputData struct {
ClientId string `json:"clientId" validate:"required"`
SendUserId string `json:"sendUserId"`
Code int `json:"code"`
Msg string `json:"msg"`
Data string `json:"data"`
}
4.3.6、发送消息给指定的多个客户端
type inputData struct {
ClientIds []string `json:"clientIds" validate:"required"`
SendUserId string `json:"sendUserId"`
Code int `json:"code"`
Msg string `json:"msg"`
Data string `json:"data"`
}
4.3.7、发送消息给指定的分组
type inputData struct {
SendUserId string `json:"sendUserId"`
GroupName string `json:"groupName" validate:"required"`
Code int `json:"code"`
Msg string `json:"msg"`
Data string `json:"data"`
}
4.3.8、关闭客户端
type inputData struct {
ClientId string `json:"clientId" validate:"required"`
}
5、使用场景
聊天室、对战游戏、直播间、在线教育、在线会议、在线答题、在线考试、在线投票、在线抢答、在线抽奖、在线问卷、在线调查、在线评选、在线选举、在线投票等实时通信场景,可参考物联网服务MQTT
教程。
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。