@@ -3,7 +3,6 @@ package cnet
33import (
44 "fmt"
55 "net"
6- "time"
76
87 "github.com/Cai-ki/cinx/ciface"
98 "github.com/Cai-ki/cinx/cutils"
@@ -14,151 +13,147 @@ type Server struct {
1413 //服务器的名称
1514 Name string
1615 //tcp4 or other
17- IPVersion string
18- //服务绑定的IP地址
16+ TcpVersion string
17+ //服务绑定的 IP 地址
1918 IP string
2019 //服务绑定的端口
2120 Port int
22- //当前Server的消息管理模块,用来绑定MsgId和对应的处理方法
21+ //当前 server 的消息管理模块,用来绑定 MsgId 和对应的处理方法
2322 msgHandler ciface.IMsgHandle
24- //当前Server的链接管理器
23+ //当前 server 的链接管理器
2524 ConnMgr ciface.IConnManager
2625
27- //该Server的连接创建时Hook函数
2826 OnConnStart func (conn ciface.IConnection )
29- //该Server的连接断开时的Hook函数
30- OnConnStop func (conn ciface.IConnection )
27+ OnConnStop func (conn ciface.IConnection )
3128}
3229
33- //============== 实现 ciface.IServer 里的全部接口方法 ========
34-
35- // 开启网络服务
30+ // 开启 server 服务(无阻塞)
3631func (s * Server ) Start () {
37- fmt .Printf ("[START] Server listenner at IP: %s, Port %d, is starting\n " , s .IP , s .Port )
32+ // 输出 server 信息
33+ fmt .Println ("[Cinx] Server Name:" , s .Name , "listenner at IP:" , s .IP , " Port:" , s .Port )
3834 fmt .Printf ("[Cinx] Version: %s, MaxConn: %d, MaxPacketSize: %d\n " ,
3935 cutils .GlobalObject .Version ,
4036 cutils .GlobalObject .MaxConn ,
4137 cutils .GlobalObject .MaxPacketSize )
42- //开启一个go去做服务端Linster业务
38+
39+ // 创建协程不间断处理链接
4340 go func () {
44- //0 启动worker工作池机制
41+ //0 开启工作池
4542 s .msgHandler .StartWorkerPool ()
4643
47- //1 获取一个TCP的Addr
48- addr , err := net .ResolveTCPAddr (s .IPVersion , fmt .Sprintf ("%s:%d" , s .IP , s .Port ))
44+ //1 封装 tcp 地址
45+ addr , err := net .ResolveTCPAddr (s .TcpVersion , fmt .Sprintf ("%s:%d" , s .IP , s .Port ))
4946 if err != nil {
50- fmt .Println ("resolve tcp addr err: " , err )
47+ fmt .Println ("[Cinx] resolve tcp address err: " , err )
5148 return
5249 }
5350
54- //2 监听服务器地址
55- listenner , err := net .ListenTCP (s .IPVersion , addr )
51+ //2 创建监听 socket
52+ listenner , err := net .ListenTCP (s .TcpVersion , addr )
5653 if err != nil {
57- fmt .Println ("listen" , s .IPVersion , "err" , err )
54+ fmt .Println ("[Cinx] listen" , s .TcpVersion , "err" , err )
5855 return
5956 }
6057
61- //已经监听成功
62- fmt .Println ("start Cinx server " , s . Name , " succ , now listenning..." )
58+ //输出监听成功信息
59+ fmt .Println ("[ Cinx] start success , now listenning..." )
6360
64- //TODO server.go 应该有一个自动生成ID的方法
65- var cid uint32
66- cid = 0
61+ // 简单实现一个自增的连接 ID
62+ var cid uint32 = 0
6763
68- //3 启动server网络连接业务
64+ //3 持续监听客户端连接
6965 for {
7066 //3.1 阻塞等待客户端建立连接请求
7167 conn , err := listenner .AcceptTCP ()
7268 if err != nil {
73- fmt .Println ("Accept err " , err )
69+ fmt .Println ("[Cinx] Accept err " , err )
7470 continue
7571 }
7672
77- //3.2 设置服务器最大连接控制,如果超过最大连接,那么则关闭此新的连接
73+ //3.2 判断当前服务器的连接数是否已经超过最大连接数
7874 if s .ConnMgr .Len () >= cutils .GlobalObject .MaxConn {
7975 conn .Close ()
8076 continue
8177 }
82- //3.3 处理该新连接请求的 业务 方法, 此时应该有 handler 和 conn是绑定的
78+
79+ //3.3 初始化连接模块
8380 dealConn := NewConntion (s , conn , cid , s .msgHandler )
8481 cid ++
8582
86- //3.4 启动当前链接的处理业务
83+ //3.4 启动协程处理当前连接的业务
8784 go dealConn .Start ()
8885 }
8986 }()
9087}
9188
89+ // 停止 server 服务
9290func (s * Server ) Stop () {
93- fmt .Println ("[STOP] Cinx server , name " , s .Name )
91+ fmt .Println ("[Cinx] stop server , name " , s .Name )
9492
95- //将其他需要清理的连接信息或者其他信息 也要一并停止或者清理
93+ // 通过 ConnManager 清除并停止所有连接
9694 s .ConnMgr .ClearConn ()
9795}
9896
97+ // 开启 server 服务(阻塞)
9998func (s * Server ) Serve () {
10099 s .Start ()
101100
102101 //TODO Server.Serve() 是否在启动服务的时候 还要处理其他的事情呢 可以在这里添加
103102
104- //阻塞,否则主Go退出, listenner的go将会退出
105- for {
106- time .Sleep (10 * time .Second )
107- }
103+ // 阻塞
104+ select {}
108105}
109106
110- // 路由功能:给当前服务注册一个路由业务方法,供客户端链接处理使用
107+ // 为特定消息注册处理函数
111108func (s * Server ) AddRouter (msgId uint32 , router ciface.IRouter ) {
112109 s .msgHandler .AddRouter (msgId , router )
113110
114- fmt .Println ("Add Router succ ! " )
111+ fmt .Println ("[Cinx] Add Router success ! " )
115112}
116113
117114// 得到链接管理
118115func (s * Server ) GetConnMgr () ciface.IConnManager {
119116 return s .ConnMgr
120117}
121118
122- // 设置该Server的连接创建时Hook函数
119+ // 设置 server 的连接创建时 hook 函数
123120func (s * Server ) SetOnConnStart (hookFunc func (ciface.IConnection )) {
124121 s .OnConnStart = hookFunc
125122}
126123
127- // 设置该Server的连接断开时的Hook函数
124+ // 设置 server 的连接断开时 hook 函数
128125func (s * Server ) SetOnConnStop (hookFunc func (ciface.IConnection )) {
129126 s .OnConnStop = hookFunc
130127}
131128
132- // 调用连接OnConnStart Hook函数
129+ // 调用 hook 函数
133130func (s * Server ) CallOnConnStart (conn ciface.IConnection ) {
134131 if s .OnConnStart != nil {
135- fmt .Println ("---> CallOnConnStart...." )
132+ fmt .Println ("[Cinx] CallOnConnStart...." )
136133 s .OnConnStart (conn )
137134 }
138135}
139136
140- // 调用连接OnConnStop Hook函数
137+ // 调用 hook 函数
141138func (s * Server ) CallOnConnStop (conn ciface.IConnection ) {
142139 if s .OnConnStop != nil {
143- fmt .Println ("---> CallOnConnStop...." )
140+ fmt .Println ("[Cinx] CallOnConnStop...." )
144141 s .OnConnStop (conn )
145142 }
146143}
147144
148- /*
149- 创建一个服务器句柄
150- */
145+ // 创建 server 实例
151146func NewServer () ciface.IServer {
152- //先初始化全局配置文件
147+ //初始化全局配置文件
153148 cutils .GlobalObject .Reload ()
154149
155150 s := & Server {
156- Name : cutils .GlobalObject .Name , //从全局参数获取
157- IPVersion : "tcp4" ,
158- IP : cutils .GlobalObject .Host , //从全局参数获取
159- Port : cutils .GlobalObject .TcpPort , //从全局参数获取
160- msgHandler : NewMsgHandle (), //msgHandler 初始化
161- ConnMgr : NewConnManager (), //创建ConnManager
151+ Name : cutils .GlobalObject .Name ,
152+ TcpVersion : "tcp4" ,
153+ IP : cutils .GlobalObject .Host ,
154+ Port : cutils .GlobalObject .TcpPort ,
155+ msgHandler : NewMsgHandle (),
156+ ConnMgr : NewConnManager (),
162157 }
163158 return s
164159}
0 commit comments