1 server.go

  1. // 处理业务
  2. func (this *Server) Handler(conn net.Conn) {
  3. user := NewUser(conn, this)
  4. user.Online()
  5. // 监听用户是否活跃的channel
  6. isLive := make(chan bool)
  7. // 接收客户端发送的消息
  8. go func() {
  9. buf := make([]byte, 4096)
  10. for {
  11. n, err := conn.Read(buf)
  12. if n == 0 {
  13. user.Offline()
  14. return
  15. }
  16. if err != nil && err != io.EOF {
  17. fmt.Println("Conn Read err:", err)
  18. return
  19. }
  20. // 提取用户的消息
  21. msg := string(buf[:n-1])
  22. // 用户针对消息进行处理
  23. user.DoMessage(msg)
  24. // 把用户设为活跃
  25. isLive <- true
  26. }
  27. }()
  28. // 当前handler阻塞
  29. for {
  30. select {
  31. case <-isLive:
  32. // 不做任何事情, 为了激活select, 更新下面的定时器
  33. case <-time.After(time.Second * 30):
  34. // 已经超时, 将当前用户踢出群聊
  35. user.SendMsg("你被踢了\n")
  36. // 销毁管道
  37. close(user.C)
  38. // 关闭连接
  39. conn.Close()
  40. // 退出当前的handler
  41. return // runtime.Goexit()
  42. }
  43. }
  44. }