欢迎光临散文网 会员登陆 & 注册

8小时转职Golang工程师(如果你想低成本学习Go语言)

2022-10-12 10:05 作者:随风的叶子  | 我要投稿

超时踢出功能:我直接使用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() //关闭连接
}


8小时转职Golang工程师(如果你想低成本学习Go语言)的评论 (共 条)

分享到微博请遵守国家法律