8小時(shí)轉(zhuǎn)職Golang工程師(如果你想低成本學(xué)習(xí)Go語言)
2022-10-12 10:05 作者:隨風(fēng)的葉子 | 我要投稿

超時(shí)踢出功能:我直接使用net.Conn的方法,超過時(shí)間就不等待了,這樣我就可以退出當(dāng)前協(xié)程和關(guān)閉連接了。
func (s *Server) handler(user *User) { //監(jiān)聽信息的接收 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被退出時(shí)觸發(fā),下線 if n == 0 { user.Offline() //下線 return } //異常處理(ctrl+c退出不屬于io.EOF,所以丟在下面吧) if err != nil && err != io.EOF { user.Offline() //出現(xiàn)異常,下線 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() //關(guān)閉連接 }
標(biāo)簽: