IM-System版本0.7实现超时强踢
This commit is contained in:
parent
9e012b21b7
commit
6759cf4af0
@ -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类的成员方法:启动服务器的接口
|
||||
|
Loading…
Reference in New Issue
Block a user