Socket详情
案例教程教程
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
import Socket "github.com/hulutech-web/goravel-socket"
在providers数组中添加
&Socket.ServiceProvider{},
import "github.com/hulutech-web/goravel-socket/servers"
func Web() {
websocketHandler := &servers.Controller{}
facades.Route().Get("/ws", websocketHandler.Run)
go servers.Manager.Start()
}
1、注册大区,systemId,不能重复,随机值,需缓存
2、连接ws,需要携带systemId头信息,连接成功后返回clientId,缓存至本地(这个时候会出现:xxx上线了,xxx下线了),每上线一个人将该人的clientId存入本地缓存,方便随时根据client进行发送消息
3、绑定客户端到分组(房间),对战双方都需要绑定,其他业务逻辑自行解析,注意需要将字符串结构为json格式
go run . artisan vendor:publish --package=github.com/hulutech-web/goravel-socket
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) //获取所有分组
})
type inputData struct {
SystemId string `json:"systemId" form:"systemId" validate:"required"`
}
type inputData struct {
ClientId string `json:"clientId" validate:"required"`
GroupName string `json:"groupName" validate:"required"`
UserId string `json:"userId"`
Extend string `json:"extend"` // 拓展字段,方便业务存储数据
}
type inputData struct {
ClientId string `json:"clientId" validate:"required"`
UserId string `json:"userId"`
Extend string `json:"extend"` // 拓展字段,方便业务存储数据
}
type inputData struct {
GroupName string `json:"groupName" validate:"required"`
Code int `json:"code"`
Msg string `json:"msg"`
Data interface{} `json:"data"`
}
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"`
}
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"`
}
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"`
}
type inputData struct {
ClientId string `json:"clientId" validate:"required"`
}
聊天室、对战游戏、直播间、在线教育、在线会议、在线答题、在线考试、在线投票、在线抢答、在线抽奖、在线问卷、在线调查、在线评选、在线选举、在线投票等实时通信场景,可参考物联网服务MQTT 教程。