肥宅自学平台_人人成为技术开发者

肥宅人只等待您,联系我们吧,曾经的巅峰是否能回来?我们正在用心服务!

golang websocket 如何监听 用户是否在线 和离线

 更新时间:2023-12-20 10:40:09   作者:肥宅-季波   我要评论(0)  

         在Golang中使用WebSocket监听用户是否在线或离线可以通过维护一个用户在线状态的数据结构来实现。以下是一个简单的示例:
  1. package main
  2. import (
  3.     "log"
  4.     "net/http"
  5.     "sync"
  6.     "golang.org/x/net/websocket"
  7. )
  8. // 用于存储用户在线状态的结构体
  9. type OnlineUsers struct {
  10.     users map[string]bool // 用户名和在线状态的映射
  11.     mutex sync.Mutex      // 用于保证并发安全
  12. }
  13. // 添加用户到在线列表中
  14. func (ou *OnlineUsers) AddUser(username string) {
  15.     ou.mutex.Lock()
  16.     defer ou.mutex.Unlock()
  17.     ou.users[username] = true
  18.     log.Printf("用户 %s 上线了", username)
  19. }
  20. // 从在线列表中删除用户
  21. func (ou *OnlineUsers) RemoveUser(username string) {
  22.     ou.mutex.Lock()
  23.     defer ou.mutex.Unlock()
  24.     delete(ou.users, username)
  25.     log.Printf("用户 %s 下线了", username)
  26. }
  27. // 检查用户是否在线
  28. func (ou *OnlineUsers) IsUserOnline(username string) bool {
  29.     ou.mutex.Lock()
  30.     defer ou.mutex.Unlock()
  31.     _, ok := ou.users[username]
  32.     return ok
  33. }
  34. func wsHandler(ws *websocket.Conn, onlineUsers *OnlineUsers) {
  35.     defer ws.Close()
  36.     // 读取用户名
  37.     var username string
  38.     err := websocket.Message.Receive(ws, &username)
  39.     if err != nil {
  40.         log.Println("接收用户名错误:", err)
  41.         return
  42.     }
  43.     // 添加用户到在线列表
  44.     onlineUsers.AddUser(username)
  45.     defer onlineUsers.RemoveUser(username)
  46.     // 在这里可根据需要进行其他的业务逻辑处理
  47.     // ...
  48.     // 监听连接关闭事件,以检测用户是否离线
  49.     for {
  50.         _, err := ws.Read(nil)
  51.         if err != nil {
  52.             log.Println("用户", username, "断开连接:", err)
  53.             return
  54.         }
  55.     }
  56. }
  57. func main() {
  58.     onlineUsers := &OnlineUsers{
  59.         users: make(map[string]bool),
  60.     }
  61.     http.Handle("/ws", websocket.Handler(func(ws *websocket.Conn) {
  62.         wsHandler(ws, onlineUsers)
  63.     }))
  64.     err := http.ListenAndServe(":8080", nil)
  65.     if err != nil {
  66.         log.Fatal("服务器启动失败:", err)
  67.     }
  68. }

在上述示例中,我们创建了一个名为OnlineUsers的结构体来管理用户的在线状态。该结构体包含一个users字段用于存储用户名和在线状态的映射,以及一个互斥锁mutex用于保证并发安全。

在wsHandler函数中,我们首先从WebSocket连接获取用户的用户名,并将其添加到OnlineUsers中的在线列表中。然后在连接关闭事件中,如果读取操作发生错误,我们将用户从在线列表中删除,表示用户离线。

你可以根据需要在wsHandler函数中添加其他业务逻辑,例如处理聊天消息、广播消息给在线用户等。

请注意,上述示例仅为演示用途,并未处理真正的用户身份验证和错误处理。在生产环境中,你应该进行适当的安全性检查和错误处理。



"小礼物走一走,来肥宅自学平台支持我"
评论区

评论

共条评论
  • 这篇文章还没有收到评论,赶紧来抢沙发吧~
客服中心在线客服
全心全意为平台用户服务
Copyright © 2017-2023 自学平台网站地图:去查看>
  • 肥宅人自己的自学平台
  • 人人都能成为平台讲师
  • 贡献你的力量壮大肥宅自学平台
  • 将自己的能力变现
  • 实现人生的第二职业
网址收藏平台安卓APP
微信公众号微信公众号

本站部分图片或者资源来自程序自动采集或卖家(商家)发布,如果侵犯了您的权益请与我们联系,我们将在24小时内删除!谢谢!

肥宅自学教程网是一个主打IT视频教程、自媒体运行、摄影剪辑等内容的资源学习交流平台。