1
1
package dove
2
2
3
3
import (
4
+ "errors"
5
+ "fmt"
6
+ "github.com/golang/protobuf/proto"
7
+ api "github.com/hwholiday/ghost/dove/api/dove"
8
+ "github.com/hwholiday/ghost/dove/network"
4
9
"log"
5
10
"net"
6
11
"sync"
7
-
8
- "github.com/hwholiday/learning_tools/dove/network"
9
12
)
10
13
11
14
const (
12
15
DefaultWsPort = ":8081"
13
16
)
14
17
const (
15
- DefaultConnAcceptCrcId int = 1
16
- DefaultConnCloseCrcId int = 2
18
+ DefaultConnAcceptCrcId uint64 = 1
19
+ DefaultConnCloseCrcId uint64 = 2
17
20
)
18
21
19
22
type HandleFunc func (cli network.Conn , reqData interface {})
20
23
21
24
type Dove interface {
22
- RegisterHandleFunc (id int , fn HandleFunc )
25
+ RegisterHandleFunc (id uint64 , fn HandleFunc )
23
26
ListenWs () error
24
27
}
25
28
26
29
type dove struct {
27
30
rw sync.RWMutex
28
31
manger * manager
29
- HandleFuncMap map [int ]HandleFunc
32
+ HandleFuncMap map [uint64 ]HandleFunc
30
33
}
31
34
32
35
func NewDove () Dove {
33
36
h := dove {
34
37
manger : Manager (),
35
- HandleFuncMap : make (map [int ]HandleFunc ),
38
+ HandleFuncMap : make (map [uint64 ]HandleFunc ),
36
39
}
37
40
return & h
38
41
}
39
42
40
- func (h * dove ) RegisterHandleFunc (id int , fn HandleFunc ) {
43
+ func (h * dove ) verifyID (id uint64 ) error {
44
+ if id == DefaultConnCloseCrcId || id == DefaultConnAcceptCrcId {
45
+ return errors .New ("please don't use default id" )
46
+ }
47
+ return nil
48
+ }
49
+
50
+ func (h * dove ) RegisterHandleFunc (id uint64 , fn HandleFunc ) {
51
+ if err := h .verifyID (id ); err != nil {
52
+ log .Printf ("[Dove] RegisterHandleFunc : %s \n " , err .Error ())
53
+ return
54
+ }
41
55
h .rw .Lock ()
42
56
defer h .rw .Unlock ()
43
57
if _ , ok := h .HandleFuncMap [id ]; ok {
@@ -50,6 +64,14 @@ func (h *dove) RegisterHandleFunc(id int, fn HandleFunc) {
50
64
func (h * dove ) ListenWs () error {
51
65
return nil
52
66
}
67
+ func (h * dove ) triggerHandle (client network.Conn , id uint64 , req []byte ) {
68
+ fn , ok := h .HandleFuncMap [id ]
69
+ if ! ok {
70
+ log .Printf ("[Dove] accept HandleFuncMap not register id : %d \n " , req )
71
+ return
72
+ }
73
+ fn (client , req )
74
+ }
53
75
54
76
func (h * dove ) accept (conn net.Conn ) error {
55
77
client , err := network .NewConn (network .WithConn (conn ))
@@ -59,17 +81,30 @@ func (h *dove) accept(conn net.Conn) error {
59
81
if err = h .manger .Add (client .Cache ().Get (network .Identity ).String (), client ); err != nil {
60
82
return err
61
83
}
84
+ h .triggerHandle (client , DefaultConnAcceptCrcId , nil )
62
85
for {
63
86
byt , err := client .Read ()
64
87
if err != nil {
65
88
h .manger .Del (client .Cache ().Get (network .Identity ).String ())
89
+ h .triggerHandle (client , DefaultConnCloseCrcId , nil )
66
90
return err
67
91
}
68
- fn , ok := h . HandleFuncMap [ 1 ]
69
- if ! ok {
70
- log .Printf ("[Dove] HandleFunc not register id : %d \n " )
92
+ req , err := parseByt ( byt )
93
+ if err != nil {
94
+ log .Printf ("[Dove] accept parseByt %s \n " , err . Error () )
71
95
continue
72
96
}
73
- fn (client , byt )
97
+ h .triggerHandle (client , req .GetId (), req .GetData ())
98
+ }
99
+ }
100
+
101
+ func parseByt (byt []byte ) (* api.Dove , error ) {
102
+ var req api.Dove
103
+ if len (byt ) < 8 {
104
+ return nil , fmt .Errorf ("byt len is : %d minimum length is 8\n " , len (byt ))
105
+ }
106
+ if err := proto .Unmarshal (byt , & req ); err != nil {
107
+ return nil , err
74
108
}
109
+ return & req , nil
75
110
}
0 commit comments