8小时转职Golang工程师(如果你想低成本学习Go语言)

超时踢出功能:我直接使用net.Conn的方法,超过时间就不等待了,这样我就可以退出当前协程和关闭连接了。
func (s *Server) handler(user *User) { //监听信息的接收 go func() { buf := make([]byte, 1024*4) //大小4KB for { user.Conn.SetReadDeadline(time.Now().Add(10 * time.Second)) n, err := user.Conn.Read(buf) //nc被退出时触发,下线 if n == 0 { user.Offline() //下线 return } //异常处理(ctrl+c退出不属于io.EOF,所以丢在下面吧) if err != nil && err != io.EOF { user.Offline() //出现异常,下线 log.Printf("Conn.Read err: %v\n", err) return } //消息处理 user.DealWithMessage(string(buf[:n-1])) } }() }
------用户下线代码
// Offline 用户下线 func (u *User) Offline() { s := u.server s.broadcast(u.Name+",下线!", u) s.lock.Lock() delete(s.onlineUsers, u.Name) s.lock.Unlock() u.Conn.Close() //关闭连接 }