在Golang中使用WebSocket监听用户是否在线或离线可以通过维护一个用户在线状态的数据结构来实现。以下是一个简单的示例:
- package main
- import (
- "log"
- "net/http"
- "sync"
- "golang.org/x/net/websocket"
- )
- // 用于存储用户在线状态的结构体
- type OnlineUsers struct {
- users map[string]bool // 用户名和在线状态的映射
- mutex sync.Mutex // 用于保证并发安全
- }
- // 添加用户到在线列表中
- func (ou *OnlineUsers) AddUser(username string) {
- ou.mutex.Lock()
- defer ou.mutex.Unlock()
- ou.users[username] = true
- log.Printf("用户 %s 上线了", username)
- }
- // 从在线列表中删除用户
- func (ou *OnlineUsers) RemoveUser(username string) {
- ou.mutex.Lock()
- defer ou.mutex.Unlock()
- delete(ou.users, username)
- log.Printf("用户 %s 下线了", username)
- }
- // 检查用户是否在线
- func (ou *OnlineUsers) IsUserOnline(username string) bool {
- ou.mutex.Lock()
- defer ou.mutex.Unlock()
- _, ok := ou.users[username]
- return ok
- }
- func wsHandler(ws *websocket.Conn, onlineUsers *OnlineUsers) {
- defer ws.Close()
- // 读取用户名
- var username string
- err := websocket.Message.Receive(ws, &username)
- if err != nil {
- log.Println("接收用户名错误:", err)
- return
- }
- // 添加用户到在线列表
- onlineUsers.AddUser(username)
- defer onlineUsers.RemoveUser(username)
- // 在这里可根据需要进行其他的业务逻辑处理
- // ...
- // 监听连接关闭事件,以检测用户是否离线
- for {
- _, err := ws.Read(nil)
- if err != nil {
- log.Println("用户", username, "断开连接:", err)
- return
- }
- }
- }
- func main() {
- onlineUsers := &OnlineUsers{
- users: make(map[string]bool),
- }
- http.Handle("/ws", websocket.Handler(func(ws *websocket.Conn) {
- wsHandler(ws, onlineUsers)
- }))
- err := http.ListenAndServe(":8080", nil)
- if err != nil {
- log.Fatal("服务器启动失败:", err)
- }
- }
在上述示例中,我们创建了一个名为OnlineUsers的结构体来管理用户的在线状态。该结构体包含一个users字段用于存储用户名和在线状态的映射,以及一个互斥锁mutex用于保证并发安全。
在wsHandler函数中,我们首先从WebSocket连接获取用户的用户名,并将其添加到OnlineUsers中的在线列表中。然后在连接关闭事件中,如果读取操作发生错误,我们将用户从在线列表中删除,表示用户离线。
你可以根据需要在wsHandler函数中添加其他业务逻辑,例如处理聊天消息、广播消息给在线用户等。
请注意,上述示例仅为演示用途,并未处理真正的用户身份验证和错误处理。在生产环境中,你应该进行适当的安全性检查和错误处理。
"小礼物走一走,来肥宅自学平台支持我"
评论区
共条评论
- 这篇文章还没有收到评论,赶紧来抢沙发吧~
首页上页1下页尾页