Blame view

common/components/server.go 2.75 KB
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
1
2
3
4
  package components
  
  import (
  	"fmt"
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
5
  	"net"
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
6
7
8
9
  	"pro2d/utils/logger"
  	"sync"
  )
  
77f5eec7   zhangqijia   plugin 插件热更 接口
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
  type Option func(*Server)
  
  func WithPlugin(iPlugin IPlugin) Option {
  	return func(server *Server) {
  		server.plugins = iPlugin
  	}
  }
  
  func WithSplitter(splitter ISplitter) Option {
  	return func(server *Server) {
  		server.splitter = splitter
  	}
  }
  
  func WithConnCbk(cb ConnectionCallback) Option {
  	return func(server *Server) {
  		server.connectionCallback = cb
  	}
  }
  
  func WithMsgCbk(cb MessageCallback) Option {
  	return func(server *Server) {
  		server.messageCallback = cb
  	}
  }
  
  func WithCloseCbk(cb CloseCallback) Option {
  	return func(server *Server) {
  		server.closeCallback = cb
  	}
  }
  
  func WithTimerCbk(cb TimerCallback) Option {
  	return func(server *Server) {
  		server.timerCallback = cb
  	}
  }
  
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
48
49
  
  type Server struct {
77f5eec7   zhangqijia   plugin 插件热更 接口
50
51
52
53
  	PluginPath 			string
  	plugins  			IPlugin
  	splitter 			ISplitter
  	actionHandlers 		sync.Map
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
54
  
9a9d092e   zhangqijia   每条连接增加一个定时器,每条连接增...
55
56
57
58
  	connectionCallback 	ConnectionCallback
  	messageCallback    	MessageCallback
  	closeCallback      	CloseCallback
  	timerCallback 		TimerCallback
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
59
  
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
60
  	port 				int
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
61
62
63
  	Clients *sync.Map
  }
  
77f5eec7   zhangqijia   plugin 插件热更 接口
64
  func NewServer(port int, options ...Option) IServer {
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
65
  	s := &Server{
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
66
  		port:      port,
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
67
68
  		Clients:    new(sync.Map),
  	}
77f5eec7   zhangqijia   plugin 插件热更 接口
69
70
71
72
  	for _, option := range options {
  		option(s)
  	}
  
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
  	return s
  }
  
  func (s *Server) GetSplitter() ISplitter {
  	return s.splitter
  }
  
  func (s *Server) GetIConnection(id int) IConnection {
  	c, ok := s.Clients.Load(id)
  	if !ok {
  		return nil
  	}
  	return c.(IConnection)
  }
  
77f5eec7   zhangqijia   plugin 插件热更 接口
88
89
90
91
  func (s *Server) GetPlugin() IPlugin {
  	return s.plugins
  }
  
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
92
93
94
95
96
97
98
99
100
101
102
103
104
  func (s *Server) SetConnectionCallback(cb ConnectionCallback) {
  	s.connectionCallback = cb
  }
  
  func (s *Server) SetMessageCallback(cb MessageCallback) {
  	s.messageCallback = cb
  }
  
  func (s *Server) SetCloseCallback(cb CloseCallback) {
  	s.closeCallback = cb
  }
  
  func (s *Server) SetTimerCallback(cb TimerCallback) {
9a9d092e   zhangqijia   每条连接增加一个定时器,每条连接增...
105
  	s.timerCallback = cb
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
106
107
108
109
110
111
112
113
  }
  
  func (s *Server) newConnection(conn IConnection) {
  	s.Clients.Store(conn.GetID(), conn)
  
  	conn.SetConnectionCallback(s.connectionCallback)
  	conn.SetCloseCallback(s.removeConnection)
  	conn.SetMessageCallback(s.messageCallback)
9a9d092e   zhangqijia   每条连接增加一个定时器,每条连接增...
114
  	conn.SetTimerCallback(s.timerCallback)
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
115
116
117
118
119
120
121
122
123
  
  	go conn.Start()
  }
  
  func (s *Server) removeConnection(conn IConnection) {
  	s.closeCallback(conn)
  	s.Clients.Delete(conn.GetID())
  }
  
77f5eec7   zhangqijia   plugin 插件热更 接口
124
125
126
  func (s *Server) Start() error {
  	if err := s.plugins.LoadPlugin(); err != nil {
  		return err
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
127
  	}
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
128
  
0e5d52de   zhangqijia   reactor: 重构底层框架1.0
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
  	port := fmt.Sprintf(":%d", s.port)
  	l, err := net.Listen("tcp", port)
  	if err != nil {
  		return err
  	}
  	//监听端口
  	logger.Debug("listen on %s\n", port)
  	id := 0
  	for {
  		conn, err := l.Accept()
  		if err != nil {
  			return err
  		}
  
  		id++
  		client := NewConn(id, conn, s)
  		s.newConnection(client)
  	}
  }
  
  func (s *Server)Stop()  {
  	StopTimer()
  	s.Clients.Range(func(key, value interface{}) bool {
  		client := value.(IConnection)
  		client.Stop()
  		return true
  	})
  }