// 处理中心处理获取到的信息 func(h *Hub) Run() { for { select { //从注册chan中取数据 case user := <-h.Register: //取到数据后将数据添加到用户列表中 h.userList[user] = true case user := <-h.Unregister: //从注销列表中取数据,判断用户列表中是否存在这个用户,存在就删掉 if _, ok := h.userList[user]; ok { delete(h.userList, user) } case data := <-h.Broadcast: //从广播chan中取消息,然后遍历给每个用户,发送到用户的msg中 for u := range h.userList { select { case u.Msg <- data: default: delete(h.userList, u) close(u.Msg) } } } } }
// 处理websocket请求 funcsocketHandler(w http.ResponseWriter, r *http.Request) { // Upgrade our raw HTTP connection to a websocket based one conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Print("Error during connection upgradation:", err) return } defer conn.Close()
//连接成功后注册用户 user := &models.User{ Conn: conn, Msg: make(chan []byte), } models.Users.Register <- user //得到连接后,就可以开始读写数据了 go read(user) write(user) }
funcread(user *models.User) {
//从连接中循环读取信息 for { _, msg, err := user.Conn.ReadMessage() if err != nil { fmt.Println("用户退出:", user.Conn.RemoteAddr().String()) models.Users.Unregister <- user break } //将读取到的信息传入websocket处理器中的broadcast中, models.Users.Broadcast <- msg } } funcwrite(user *models.User) { for data := range user.Msg { err := user.Conn.WriteMessage(1, data) if err != nil { fmt.Println("写入错误") break } } }