golang和web端,websocket交互

时间:2025-04-10 21:31:31
  • package main
  • import (
  • "fmt"
  • "log"
  • "net/http"
  • "strconv"
  • "time"
  • "/gorilla/websocket"
  • )
  • //用户连接具体设置类
  • type WskCon struct {
  • Name string //生成用户名
  • Con * //定义用户连接客户端
  • OnlineTime int64 //定义用户在线时间啊in
  • }
  • //用户类
  • type Users struct {
  • cons []WskCon //连接数据集
  • HeartTime int64 //
  • ChnCon chan * //协程连接
  • }
  • var u *Users
  • func init() {
  • //初始化用户类
  • s := &Users{HeartTime: 60}
  • u = s
  • }
  • func main() {
  • ("/ws", handleWebSocket)
  • ("/all", handleAll)
  • err := (":9999", nil)
  • if err != nil {
  • ("ListenAndServe: ", err)
  • }
  • }
  • //群发信息
  • func handleAll(w , r *) {
  • for _,ws:= range {
  • err := (, []byte("群发信息了"))
  • (err)
  • }
  • ("所有连接",)
  • }
  • //切片元素移除
  • func removeSlice(slice []WskCon, index int) []WskCon{
  • return append(slice[:index],slice[index+1:]...)
  • }
  • //心跳检测
  • func heartCheck() {
  • ticker := (3*)
  • defer ()
  • for {
  • select {
  • case t := <-:
  • ("Current time: ", t, )
  • currTime := ().Unix()
  • for k, v := range {
  • //超过心跳时间,自动剔除此数据,超时60s
  • if (currTime - ) > {
  • //移除退出的连接
  • = removeSlice(, k)
  • ()
  • }
  • }
  • }
  • }
  • }
  • func handleWebSocket(w , r *) {
  • // 升级 HTTP 连接为 WebSocket 连接
  • upgrader := {
  • ReadBufferSize: 1024,
  • WriteBufferSize: 1024,
  • // 解决跨域问题
  • CheckOrigin: func(r *) bool {
  • return true
  • },
  • }
  • //检查连接数
  • conn, err := (w, r, nil)
  • if len() >= 2 {
  • (, []byte("连接人数太多,请稍后重试"))
  • ()
  • return
  • }
  • (, []byte("老铁,我连接上了"))
  • //添加连接到集合
  • name := (().Unix(),10)
  • = append(, WskCon{
  • Name: name,
  • Con: conn,
  • OnlineTime: ().Unix(),
  • })
  • ("all con->",)
  • if err != nil {
  • (err)
  • return
  • }
  • defer ()
  • //检测心跳
  • go heartCheck()
  • //chans := make(chan *, 2000)
  • // 循环读取 WebSocket 消息
  • for {
  • _, message, err := ()
  • if err != nil {
  • (err)
  • break
  • }
  • ("收到消息:", string(message))
  • //发送消息,更新在线时间
  • for k,v:= range {
  • if name == {
  • [k].OnlineTime = ().Unix()
  • }
  • }
  • // 发送消息
  • err = (, message)
  • if err != nil {
  • (err)
  • break
  • }
  • }
  • }