diff --git a/bilibili/aceld/IM-System/server.go b/bilibili/aceld/IM-System/server.go index 04d212e..6dce1b2 100644 --- a/bilibili/aceld/IM-System/server.go +++ b/bilibili/aceld/IM-System/server.go @@ -4,7 +4,9 @@ import ( "fmt" "io" "net" + "runtime" "sync" + "time" ) type Server struct { @@ -53,6 +55,8 @@ func (server *Server) Handler(conn net.Conn) { // 用户上线, 将用户加入到OnlineMap中 user.Online() + // 监听用户是否活跃的channel + isLive := make(chan bool) // 接收客户端发送的消息 go func() { @@ -71,10 +75,28 @@ func (server *Server) Handler(conn net.Conn) { msg := string(buf[:n-1]) // 将得到的消息进行广播 user.DoMessage(msg) + // 用户的任意消息代表当前用户是一个活跃的,将true发给isLive管道 + isLive <- true } }() - // 当前handler阻塞 - select {} + // 设定定时器实现超时强踢 + for { + select { + case <-isLive: + // 当前用户是活跃的,应该重置定时器 + // 不做任何事情,为了激活select,更新下面的定时器 + // 只要执行time.After即实现重置定时器 + case <-time.After(time.Second * 10): + // 已经超时,将当前User强制关闭 + user.SendMsg("你被踢了") + // 销毁用户的资源 + close(user.C) + // 关闭连接 + conn.Close() + // 退出 + runtime.Goexit() // return + } + } } // Server类的成员方法:启动服务器的接口