From 6759cf4af04cea3c2387b6004d6fbbde4f1255a8 Mon Sep 17 00:00:00 2001 From: wandoubaba Date: Mon, 25 Nov 2024 11:16:58 +0800 Subject: [PATCH] =?UTF-8?q?IM-System=E7=89=88=E6=9C=AC0.7=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E8=B6=85=E6=97=B6=E5=BC=BA=E8=B8=A2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bilibili/aceld/IM-System/server.go | 26 ++++++++++++++++++++++++-- 1 file changed, 24 insertions(+), 2 deletions(-) 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类的成员方法:启动服务器的接口