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() //关闭连接
}

