-
Notifications
You must be signed in to change notification settings - Fork 883
/
Copy pathtransmitter.go
62 lines (42 loc) · 1.19 KB
/
transmitter.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
package tcp
import (
"github.com/davyxu/cellnet"
"github.com/davyxu/cellnet/util"
"io"
"net"
)
type TCPMessageTransmitter struct {
}
type socketOpt interface {
MaxPacketSize() int
ApplySocketReadTimeout(conn net.Conn, callback func())
ApplySocketWriteTimeout(conn net.Conn, callback func())
}
func (TCPMessageTransmitter) OnRecvMessage(ses cellnet.Session) (msg interface{}, err error) {
reader, ok := ses.Raw().(io.Reader)
// 转换错误,或者连接已经关闭时退出
if !ok || reader == nil {
return nil, nil
}
opt := ses.Peer().(socketOpt)
if conn, ok := reader.(net.Conn); ok {
// 有读超时时,设置超时
opt.ApplySocketReadTimeout(conn, func() {
msg, err = util.RecvLTVPacket(reader, opt.MaxPacketSize())
})
}
return
}
func (TCPMessageTransmitter) OnSendMessage(ses cellnet.Session, msg interface{}) (err error) {
writer, ok := ses.Raw().(io.Writer)
// 转换错误,或者连接已经关闭时退出
if !ok || writer == nil {
return nil
}
opt := ses.Peer().(socketOpt)
// 有写超时时,设置超时
opt.ApplySocketWriteTimeout(writer.(net.Conn), func() {
err = util.SendLTVPacket(writer, ses.(cellnet.ContextSet), msg)
})
return
}