1 server.go
// 处理业务func (this *Server) Handler(conn net.Conn) { user := NewUser(conn, this) user.Online() // 监听用户是否活跃的channel isLive := make(chan bool) // 接收客户端发送的消息 go func() { buf := make([]byte, 4096) for { n, err := conn.Read(buf) if n == 0 { user.Offline() return } if err != nil && err != io.EOF { fmt.Println("Conn Read err:", err) return } // 提取用户的消息 msg := string(buf[:n-1]) // 用户针对消息进行处理 user.DoMessage(msg) // 把用户设为活跃 isLive <- true } }() // 当前handler阻塞 for { select { case <-isLive: // 不做任何事情, 为了激活select, 更新下面的定时器 case <-time.After(time.Second * 30): // 已经超时, 将当前用户踢出群聊 user.SendMsg("你被踢了\n") // 销毁管道 close(user.C) // 关闭连接 conn.Close() // 退出当前的handler return // runtime.Goexit() } }}