You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

113 lines
2.6 KiB

  1. package znet
  2. import (
  3. "errors"
  4. "fmt"
  5. "net"
  6. "time"
  7. "zinx/ziface"
  8. )
  9. //iServer 接口实现,定义一个Server服务类
  10. type Server struct {
  11. //服务器的名称
  12. Name string
  13. //tcp4 or other
  14. IPVersion string
  15. //服务绑定的IP地址
  16. IP string
  17. //服务绑定的端口
  18. Port int
  19. }
  20. //============== 定义当前客户端链接的handle api ===========
  21. func CallBackToClient(conn *net.TCPConn, data []byte, cnt int) error {
  22. //回显业务
  23. fmt.Println("[Conn Handle] CallBackToClient ... ")
  24. if _, err := conn.Write(data[:cnt]); err !=nil {
  25. fmt.Println("write back buf err ", err)
  26. return errors.New("CallBackToClient error")
  27. }
  28. return nil
  29. }
  30. //============== 实现 ziface.IServer 里的全部接口方法 ========
  31. //开启网络服务
  32. func (s *Server) Start() {
  33. fmt.Printf("[START] Server listenner at IP: %s, Port %d, is starting\n", s.IP, s.Port)
  34. //开启一个go去做服务端Linster业务
  35. go func() {
  36. //1 获取一个TCP的Addr
  37. addr, err := net.ResolveTCPAddr(s.IPVersion, fmt.Sprintf("%s:%d", s.IP, s.Port))
  38. if err != nil {
  39. fmt.Println("resolve tcp addr err: ", err)
  40. return
  41. }
  42. //2 监听服务器地址
  43. listenner, err:= net.ListenTCP(s.IPVersion, addr)
  44. if err != nil {
  45. fmt.Println("listen", s.IPVersion, "err", err)
  46. return
  47. }
  48. //已经监听成功
  49. fmt.Println("start Zinx server ", s.Name, " succ, now listenning...")
  50. //TODO server.go 应该有一个自动生成ID的方法
  51. var cid uint32
  52. cid = 0
  53. //3 启动server网络连接业务
  54. for {
  55. //3.1 阻塞等待客户端建立连接请求
  56. conn, err := listenner.AcceptTCP()
  57. if err != nil {
  58. fmt.Println("Accept err ", err)
  59. continue
  60. }
  61. //3.2 TODO Server.Start() 设置服务器最大连接控制,如果超过最大连接,那么则关闭此新的连接
  62. //3.3 处理该新连接请求的 业务 方法, 此时应该有 handler 和 conn是绑定的
  63. dealConn := NewConntion(conn, cid, CallBackToClient)
  64. cid ++
  65. //3.4 启动当前链接的处理业务
  66. go dealConn.Start()
  67. }
  68. }()
  69. }
  70. func (s *Server) Stop() {
  71. fmt.Println("[STOP] Zinx server , name " , s.Name)
  72. //TODO Server.Stop() 将其他需要清理的连接信息或者其他信息 也要一并停止或者清理
  73. }
  74. func (s *Server) Serve() {
  75. s.Start()
  76. //TODO Server.Serve() 是否在启动服务的时候 还要处理其他的事情呢 可以在这里添加
  77. //阻塞,否则主Go退出, listenner的go将会退出
  78. for {
  79. time.Sleep(10*time.Second)
  80. }
  81. }
  82. /*
  83. 创建一个服务器句柄
  84. */
  85. func NewServer (name string) ziface.IServer {
  86. s:= &Server {
  87. Name :name,
  88. IPVersion:"tcp4",
  89. IP:"0.0.0.0",
  90. Port:7777,
  91. }
  92. return s
  93. }