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
}
}
}