/
connector.go
80 lines (65 loc) · 1.45 KB
/
connector.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
72
73
74
75
76
77
78
79
80
package cherryConnector
import (
"crypto/tls"
"net"
cfacade "github.com/cherry-game/cherry/facade"
clog "github.com/cherry-game/cherry/logger"
)
type (
Connector struct {
listener net.Listener
onConnectFunc cfacade.OnConnectFunc
connChan chan net.Conn
running bool
}
)
func NewConnector(size int) Connector {
connector := Connector{
connChan: make(chan net.Conn, size),
running: true,
}
return connector
}
func (p *Connector) OnConnect(fn cfacade.OnConnectFunc) {
if fn != nil {
p.onConnectFunc = fn
}
}
func (p *Connector) InChan(conn net.Conn) {
p.connChan <- conn
}
func (p *Connector) Start() {
if p.onConnectFunc == nil {
panic("onConnectFunc is nil.")
}
go func() {
for conn := range p.connChan {
p.onConnectFunc(conn)
}
}()
}
func (p *Connector) Stop() {
p.running = false
if err := p.listener.Close(); err != nil {
clog.Errorf("Failed to stop: %s", err)
}
}
func (p *Connector) Running() bool {
return p.running
}
func (p *Connector) GetListener(certFile, keyFile, address string) (net.Listener, error) {
var err error
if certFile == "" || keyFile == "" {
p.listener, err = net.Listen("tcp", address)
return p.listener, err
}
crt, err := tls.LoadX509KeyPair(certFile, keyFile)
if err != nil {
clog.Fatalf("failed to listen: %s", err.Error())
}
tlsCfg := &tls.Config{
Certificates: []tls.Certificate{crt},
}
p.listener, err = tls.Listen("tcp", address, tlsCfg)
return p.listener, err
}