今天给大家带来的是日常开发中偶尔会需要用到webSocket通讯。
先上图给大家感受一下、项目中有一个html页面,充当客户端使用的,大家可以修改script 里面的ws链接地址。然后就可以运行html。连接服务端了。
简单做个介绍吧·
ws接受消息的回调
//接受消息
wsocket.HandleMessage(func(session *melody.Session, bytes []byte) {
fmt.Println("接受到消息:", string(bytes))
//注意这个回调出来的session 只是针对他自己的客户端
//_ = session.Write(bytes)
//if err != nil {
// logs.Error("心跳包发送失败:", err)
//}
})
广播所有用户
/*
广播所有用户(推荐使用这个)
*/
func (s *WebSocketService) BoardCastAllUser(data models.WsMessage) (err error) {
data.Model = models.WsModelAdmin
var msg []byte
if msg, err = utils.StructToJson(data); err != nil {
return
}
adminClients.Range(func(key, client interface{}) bool {
//先判断该用户是否离线。
if !client.(*melody.Session).IsClosed() {
if err = client.(*melody.Session).Write(msg); err != nil {
return true
}
}
return true
})
return
}
给指定用户发送消息,(可以是多个用户)
/*
指定多个用户推送,但又不是全部用户。
*/
func (s *WebSocketService) BoardCastDesignateUser(token []string, data models.WsMessage) (err error) {
data.Model = models.WsModelAdmin
var msg []byte
if msg, err = utils.StructToJson(data); err != nil {
return
}
for _, v := range token {
value, ok := adminClients.Load(v)
if ok {
if !value.(*melody.Session).IsClosed() {
err := value.(*melody.Session).Write(msg)
if err != nil {
return errors.New("消息写入失败,token为:" + v)
}
}
}
}
return
}
针对单个用户推送消息
/*
针对单个用户推送
*/
func (s *WebSocketService) BoardCastOneUser(token string, data models.WsMessage) (err error) {
var (
msg []byte
)
if msg, err = json.Marshal(data); err != nil {
return
}
err = s.BC(msg, token)
return
}