Go语言百万级WebSocket(附带源码)

937 阅读1分钟

今天给大家带来的是日常开发中偶尔会需要用到webSocket通讯。


先上图给大家感受一下、项目中有一个html页面,充当客户端使用的,大家可以修改script 里面的ws链接地址。然后就可以运行html。连接服务端了。

image.png

简单做个介绍吧·

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

}

以上就是ws部分代码介绍,最后献上代码地址(帮忙点个小赞呗谢谢各位贤弟)

代码地址:https://gitee.com/golang520/webSocket