58
用gorilla websocket 搞一个聊天室
source link: https://segmentfault.com/a/1190000017976090?amp%3Butm_medium=referral
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
这个demo实现了:
- 消息广播
- 心跳检测
通过命令行来进行聊天
具体逻辑都在 websocket.go 这个文件里
这里的核心就是 aliveList
这个全局变量, 负责把消息分发给各客户端, 事件用channel来传递, 减少阻塞
单个链接会在 aliveList
中注册, ConnList 就是所有活跃的链接
// AliveList 当前在线列表 type AliveList struct { ConnList map[string]*Client register chan *Client destroy chan *Client broadcast chan Message cancel chan int Len int } // Client socket客户端 type Client struct { ID string conn *websocket.Conn cancel chan int }
服务启动后会执行事件监听循环
// 启动监听 func (al *AliveList) run() { log.Println("开始监听注册事件") for { select { case client := <-al.register: log.Println("注册事件:", client.ID) al.ConnList[client.ID] = client al.Len++ al.SysBroadcast(ConnectedMessage, Message{ ID: client.ID, Content: "connected", SentAt: time.Now().Unix(), }) case client := <-al.destroy: log.Println("销毁事件:", client.ID) err := client.conn.Close() if err != nil { log.Printf("destroy Error: %v \n", err) } delete(al.ConnList, client.ID) al.Len-- case message := <-al.broadcast: log.Printf("广播事件: %s %s %d \n", message.ID, message.Content, message.Type) for id := range al.ConnList { if id != message.ID { err := al.sendMessage(id, message) if err != nil { log.Println("broadcastError: ", err) } } } case sign := <-al.cancel: log.Println("终止事件: ", sign) os.Exit(0) } } }
因为消息的类型比较多, 单纯字符串无法满足需求, 就选用了比较常用的json格式去传递, 消息目前分:
const ( // SystemMessage 系统消息 SystemMessage = iota // BroadcastMessage 广播消息(正常的消息) BroadcastMessage // HeartBeatMessage 心跳消息 HeartBeatMessage // ConnectedMessage 上线通知 ConnectedMessage // DisconnectedMessage 下线通知 DisconnectedMessage ) // Message 消息体结构 type Message struct { ID string Content string SentAt int64 Type int // <- SystemMessage 等类型就是这里了 }
如果有空闲时间就再搞搞多聊天室的实现, 以及优化一下目前的事件循环逻辑
如果还有更多的余力, 就搞一个好看点的客户端?Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK