/
controller.go
71 lines (62 loc) · 1.75 KB
/
controller.go
1
2
3
4
5
6
7
8
9
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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
package server
import (
"context"
"github.com/panjf2000/ants/v2"
"net"
)
// Controller 控制器是暴露 Server 对用户非公开的接口信息,适用于功能性的拓展
type Controller interface {
// GetServer 获取服务器
GetServer() Server
// RegisterConnection 注册连接
RegisterConnection(conn net.Conn, writer ConnWriter)
// EliminateConnection 消除连接
EliminateConnection(conn net.Conn, err error)
// ReactPacket 反应连接数据包
ReactPacket(conn net.Conn, packet Packet)
// GetAnts 获取服务器异步池
GetAnts() *ants.Pool
}
type controller struct {
*server
connections map[net.Conn]*conn
}
func (s *controller) init(srv *server) *controller {
s.server = srv
s.connections = make(map[net.Conn]*conn)
return s
}
func (s *controller) GetServer() Server {
return s.server
}
func (s *controller) GetAnts() *ants.Pool {
return s.server.ants
}
func (s *controller) RegisterConnection(conn net.Conn, writer ConnWriter) {
s.server.PublishSyncMessage(s.getSysQueue(), func(ctx context.Context) {
c := newConn(s.server, conn, writer)
s.server.connections[conn] = c
s.events.onConnectionOpened(c)
})
}
func (s *controller) EliminateConnection(conn net.Conn, err error) {
s.server.PublishSyncMessage(s.getSysQueue(), func(ctx context.Context) {
c, exist := s.server.connections[conn]
if !exist {
return
}
delete(s.server.connections, conn)
s.server.events.onConnectionClosed(c, err)
})
}
func (s *controller) ReactPacket(conn net.Conn, packet Packet) {
s.server.PublishSyncMessage(s.getSysQueue(), func(ctx context.Context) {
c, exist := s.server.connections[conn]
if !exist {
return
}
s.PublishSyncMessage(c.GetQueue(), func(ctx context.Context) {
s.events.onConnectionReceivePacket(c, packet)
})
})
}