-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathconn.go
107 lines (98 loc) · 1.86 KB
/
conn.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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
package ginkgo
import (
"bufio"
"net"
log "github.com/Sirupsen/logrus"
)
type Conn struct {
baseConn net.Conn
Session *session
isRunning bool
exit chan bool
}
func NewConn(c net.Conn) *Conn {
return &Conn{
isRunning: false,
baseConn: c,
exit: make(chan bool),
}
}
func (c *Conn) setSession(s *session) {
c.Session = s
}
func (c *Conn) start(sendChan chan CoderMessage) {
c.isRunning = true
go func() {
defer func() {
c.stop()
}()
reader := bufio.NewReader(c.baseConn)
var data packet
var message CoderMessage
var err error
for c.isRunning {
log.Debugln("Conn", "Recive", "Wait")
if err := recvData(reader, &data); err != nil {
break
}
log.Debugln("Conn", "Recive", data)
message, err = c.Session.coder.Decoder(data.body)
if err != nil {
continue
}
go c.Session.recivemessage(message)
}
}()
log.Debugln("Conn", "Start")
for c.isRunning {
select {
case <-c.exit:
break
case m := <-sendChan:
if c.isRunning {
log.Debugln("Conn", "SendChan", m)
data := c.Session.coder.Encoder(m)
err := sendData(c.baseConn, packet{
body: data,
fullDuplex: true,
})
if err != nil {
//glog.NewTagField("Conn").Errorln("send", err)
sendChan <- m
c.stop()
break
}
} else {
sendChan <- m
break
}
}
}
c.baseConn.Close()
c.Session.connclose(c)
log.Debugln("Conn", "Stop")
}
func (c *Conn) stop() {
if !c.isRunning {
return
}
c.isRunning = false
c.exit <- true
}
//
//func (c *Conn) invoke() ([]byte, bool) {
// if !c.isRunning {
// return nil, false
// }
// data := make([]byte, 0)
// buf := bytes.NewBuffer(data)
// buf.Write(messageHeader)
// buf.Write(messageInvoke)
// id := DefaultUUID.GetID()
// buf.Write([]byte(id))
// buf.Write(IntToBytes(len(d)))
// buf.Write(d)
// c.send <- buf.Bytes()
// rd, ok := <-c.message
// return rd, ok
//}