Commit d98ff0fe authored by AlexStocks's avatar AlexStocks

add unconnected udp endpoint

parent 33719044
...@@ -95,8 +95,8 @@ func newSession(session getty.Session) error { ...@@ -95,8 +95,8 @@ func newSession(session getty.Session) error {
tcpConn.SetReadBuffer(conf.GettySessionParam.TcpRBufSize) tcpConn.SetReadBuffer(conf.GettySessionParam.TcpRBufSize)
tcpConn.SetWriteBuffer(conf.GettySessionParam.TcpWBufSize) tcpConn.SetWriteBuffer(conf.GettySessionParam.TcpWBufSize)
session.SetMaxMsgLen(conf.GettySessionParam.MaxMsgLen)
session.SetName(conf.GettySessionParam.SessionName) session.SetName(conf.GettySessionParam.SessionName)
session.SetMaxMsgLen(conf.GettySessionParam.MaxMsgLen)
session.SetPkgHandler(NewEchoPackageHandler()) session.SetPkgHandler(NewEchoPackageHandler())
session.SetEventListener(newEchoMessageHandler()) session.SetEventListener(newEchoMessageHandler())
session.SetRQLen(conf.GettySessionParam.PkgRQSize) session.SetRQLen(conf.GettySessionParam.PkgRQSize)
......
...@@ -96,8 +96,8 @@ func newSession(session getty.Session) error { ...@@ -96,8 +96,8 @@ func newSession(session getty.Session) error {
tcpConn.SetReadBuffer(conf.GettySessionParam.TcpRBufSize) tcpConn.SetReadBuffer(conf.GettySessionParam.TcpRBufSize)
tcpConn.SetWriteBuffer(conf.GettySessionParam.TcpWBufSize) tcpConn.SetWriteBuffer(conf.GettySessionParam.TcpWBufSize)
session.SetMaxMsgLen(conf.GettySessionParam.MaxMsgLen)
session.SetName(conf.GettySessionParam.SessionName) session.SetName(conf.GettySessionParam.SessionName)
session.SetMaxMsgLen(conf.GettySessionParam.MaxMsgLen)
session.SetPkgHandler(NewEchoPackageHandler()) session.SetPkgHandler(NewEchoPackageHandler())
session.SetEventListener(newEchoMessageHandler()) session.SetEventListener(newEchoMessageHandler())
session.SetRQLen(conf.GettySessionParam.PkgRQSize) session.SetRQLen(conf.GettySessionParam.PkgRQSize)
......
...@@ -11,6 +11,7 @@ package main ...@@ -11,6 +11,7 @@ package main
import ( import (
"math/rand" "math/rand"
"net"
"sync" "sync"
"sync/atomic" "sync/atomic"
"time" "time"
...@@ -19,7 +20,6 @@ import ( ...@@ -19,7 +20,6 @@ import (
import ( import (
"github.com/AlexStocks/getty" "github.com/AlexStocks/getty"
log "github.com/AlexStocks/log4go" log "github.com/AlexStocks/log4go"
"net"
) )
var ( var (
...@@ -51,18 +51,18 @@ func (this *EchoClient) isAvailable() bool { ...@@ -51,18 +51,18 @@ func (this *EchoClient) isAvailable() bool {
} }
func (this *EchoClient) close() { func (this *EchoClient) close() {
client.lock.Lock() this.lock.Lock()
if client.gettyClient != nil { if this.gettyClient != nil {
for _, s := range this.sessions { for _, s := range this.sessions {
log.Info("close client session{%s, last active:%s, request number:%d}", log.Info("close client session{%s, last active:%s, request number:%d}",
s.session.Stat(), s.session.GetActive().String(), s.reqNum) s.session.Stat(), s.session.GetActive().String(), s.reqNum)
s.session.Close() s.session.Close()
} }
client.gettyClient.Close() this.gettyClient.Close()
client.gettyClient = nil this.gettyClient = nil
client.sessions = client.sessions[:0] this.sessions = this.sessions[:0]
} }
client.lock.Unlock() this.lock.Unlock()
} }
func (this *EchoClient) selectSession() getty.Session { func (this *EchoClient) selectSession() getty.Session {
...@@ -86,6 +86,7 @@ func (this *EchoClient) addSession(session getty.Session) { ...@@ -86,6 +86,7 @@ func (this *EchoClient) addSession(session getty.Session) {
this.lock.Lock() this.lock.Lock()
this.sessions = append(this.sessions, &clientEchoSession{session: session}) this.sessions = append(this.sessions, &clientEchoSession{session: session})
log.Debug("after add session{%s}, session number:%d", session.Stat(), len(this.sessions))
this.lock.Unlock() this.lock.Unlock()
} }
...@@ -170,4 +171,5 @@ func (this *EchoClient) heartbeat(session getty.Session) { ...@@ -170,4 +171,5 @@ func (this *EchoClient) heartbeat(session getty.Session) {
this.removeSession(session) this.removeSession(session)
} }
log.Debug("session.WritePkg(session{%s}, context{%#v})", session.Stat(), ctx)
} }
...@@ -58,7 +58,7 @@ type ( ...@@ -58,7 +58,7 @@ type (
ServerPort int `default:"10000"` ServerPort int `default:"10000"`
ProfilePort int `default:"10086"` ProfilePort int `default:"10086"`
// session pool // client session pool
ConnectionNum int `default:"16"` ConnectionNum int `default:"16"`
// heartbeat // heartbeat
......
...@@ -140,6 +140,10 @@ func (this *EchoPackage) Unmarshal(buf *bytes.Buffer) (int, error) { ...@@ -140,6 +140,10 @@ func (this *EchoPackage) Unmarshal(buf *bytes.Buffer) (int, error) {
return 0, nil return 0, nil
} }
this.B = (string)(buf.Next((int)(len))) this.B = (string)(buf.Next((int)(len)))
//if strings.HasPrefix(this.B, "Hello, getty!") {
// gxlog.CError("idx:%d, body:%s", idx, this.B)
// idx++
//}
return (int)(this.H.Len) + echoPkgHeaderLen, nil return (int)(this.H.Len) + echoPkgHeaderLen, nil
} }
...@@ -33,26 +33,27 @@ type clientEchoSession struct { ...@@ -33,26 +33,27 @@ type clientEchoSession struct {
} }
type EchoMessageHandler struct { type EchoMessageHandler struct {
client *EchoClient
} }
func newEchoMessageHandler() *EchoMessageHandler { func newEchoMessageHandler(client *EchoClient) *EchoMessageHandler {
return &EchoMessageHandler{} return &EchoMessageHandler{client: client}
} }
func (this *EchoMessageHandler) OnOpen(session getty.Session) error { func (this *EchoMessageHandler) OnOpen(session getty.Session) error {
client.addSession(session) this.client.addSession(session)
return nil return nil
} }
func (this *EchoMessageHandler) OnError(session getty.Session, err error) { func (this *EchoMessageHandler) OnError(session getty.Session, err error) {
log.Info("session{%s} got error{%v}, will be closed.", session.Stat(), err) log.Info("session{%s} got error{%v}, will be closed.", session.Stat(), err)
client.removeSession(session) this.client.removeSession(session)
} }
func (this *EchoMessageHandler) OnClose(session getty.Session) { func (this *EchoMessageHandler) OnClose(session getty.Session) {
log.Info("session{%s} is closing......", session.Stat()) log.Info("session{%s} is closing......", session.Stat())
client.removeSession(session) this.client.removeSession(session)
} }
func (this *EchoMessageHandler) OnMessage(session getty.Session, udpCtx interface{}) { func (this *EchoMessageHandler) OnMessage(session getty.Session, udpCtx interface{}) {
...@@ -68,11 +69,12 @@ func (this *EchoMessageHandler) OnMessage(session getty.Session, udpCtx interfac ...@@ -68,11 +69,12 @@ func (this *EchoMessageHandler) OnMessage(session getty.Session, udpCtx interfac
} }
log.Debug("get echo package{%s}", p) log.Debug("get echo package{%s}", p)
client.updateSession(session)
this.client.updateSession(session)
} }
func (this *EchoMessageHandler) OnCron(session getty.Session) { func (this *EchoMessageHandler) OnCron(session getty.Session) {
clientEchoSession, err := client.getClientEchoSession(session) clientEchoSession, err := this.client.getClientEchoSession(session)
if err != nil { if err != nil {
log.Error("client.getClientSession(session{%s}) = error{%#v}", session.Stat(), err) log.Error("client.getClientSession(session{%s}) = error{%#v}", session.Stat(), err)
return return
...@@ -80,9 +82,9 @@ func (this *EchoMessageHandler) OnCron(session getty.Session) { ...@@ -80,9 +82,9 @@ func (this *EchoMessageHandler) OnCron(session getty.Session) {
if conf.sessionTimeout.Nanoseconds() < time.Since(session.GetActive()).Nanoseconds() { if conf.sessionTimeout.Nanoseconds() < time.Since(session.GetActive()).Nanoseconds() {
log.Warn("session{%s} timeout{%s}, reqNum{%d}", log.Warn("session{%s} timeout{%s}, reqNum{%d}",
session.Stat(), time.Since(session.GetActive()).String(), clientEchoSession.reqNum) session.Stat(), time.Since(session.GetActive()).String(), clientEchoSession.reqNum)
// client.removeSession(session) this.client.removeSession(session)
// return return
} }
client.heartbeat(session) this.client.heartbeat(session)
} }
...@@ -36,11 +36,12 @@ const ( ...@@ -36,11 +36,12 @@ const (
) )
const ( const (
WritePkgTimeout = 1e8 WritePkgTimeout = 1e9
) )
var ( var (
client EchoClient connectedClient EchoClient
unconnectedClient EchoClient
) )
//////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////
...@@ -53,8 +54,8 @@ func main() { ...@@ -53,8 +54,8 @@ func main() {
initProfiling() initProfiling()
initClient() initClient()
gxlog.CInfo("%s starts successfull! its version=%s\n", conf.AppName, Version)
log.Info("%s starts successfull! its version=%s\n", conf.AppName, Version) log.Info("%s starts successfull! its version=%s\n", conf.AppName, Version)
gxlog.CInfo("%s starts successfull! its version=%s\n", conf.AppName, Version)
go test() go test()
...@@ -75,25 +76,42 @@ func initProfiling() { ...@@ -75,25 +76,42 @@ func initProfiling() {
func newSession(session getty.Session) error { func newSession(session getty.Session) error {
var ( var (
ok bool ok bool
udpConn *net.UDPConn udpConn *net.UDPConn
gettyClient getty.Client
client *EchoClient
) )
if gettyClient, ok = session.EndPoint().(getty.Client); !ok {
panic(fmt.Sprintf("the endpoint type of session{%#v} is not getty.Client", session))
}
switch gettyClient {
case connectedClient.gettyClient:
client = &connectedClient
case unconnectedClient.gettyClient:
client = &unconnectedClient
default:
panic(fmt.Sprintf("illegal session{%#v} endpoint", session))
}
if conf.GettySessionParam.CompressEncoding { if conf.GettySessionParam.CompressEncoding {
session.SetCompressType(getty.CompressZip) session.SetCompressType(getty.CompressZip)
} }
if udpConn, ok = session.Conn().(*net.UDPConn); !ok { if udpConn, ok = session.Conn().(*net.UDPConn); !ok {
panic(fmt.Sprintf("%s, session.conn{%#v} is not tcp connection\n", session.Stat(), session.Conn())) panic(fmt.Sprintf("%s, session.conn{%#v} is not udp connection\n", session.Stat(), session.Conn()))
} }
udpConn.SetReadBuffer(conf.GettySessionParam.UdpRBufSize) udpConn.SetReadBuffer(conf.GettySessionParam.UdpRBufSize)
udpConn.SetWriteBuffer(conf.GettySessionParam.UdpWBufSize) udpConn.SetWriteBuffer(conf.GettySessionParam.UdpWBufSize)
session.SetMaxMsgLen(conf.MaxMsgLen)
session.SetName(conf.GettySessionParam.SessionName) session.SetName(conf.GettySessionParam.SessionName)
session.SetMaxMsgLen(conf.GettySessionParam.MaxMsgLen)
session.SetPkgHandler(NewEchoPackageHandler()) session.SetPkgHandler(NewEchoPackageHandler())
session.SetEventListener(newEchoMessageHandler()) session.SetEventListener(newEchoMessageHandler(client))
session.SetRQLen(conf.GettySessionParam.PkgRQSize) session.SetRQLen(conf.GettySessionParam.PkgRQSize)
session.SetWQLen(conf.GettySessionParam.PkgWQSize) session.SetWQLen(conf.GettySessionParam.PkgWQSize)
session.SetReadTimeout(conf.GettySessionParam.udpReadTimeout) session.SetReadTimeout(conf.GettySessionParam.udpReadTimeout)
...@@ -101,21 +119,28 @@ func newSession(session getty.Session) error { ...@@ -101,21 +119,28 @@ func newSession(session getty.Session) error {
session.SetCronPeriod((int)(conf.heartbeatPeriod.Nanoseconds() / 1e6)) session.SetCronPeriod((int)(conf.heartbeatPeriod.Nanoseconds() / 1e6))
session.SetWaitTime(conf.GettySessionParam.waitTimeout) session.SetWaitTime(conf.GettySessionParam.waitTimeout)
log.Debug("client new session:%s\n", session.Stat()) log.Debug("client new session:%s\n", session.Stat())
gxlog.CDebug("client new session:%s\n", session.Stat())
return nil return nil
} }
func initClient() { func initClient() {
client.gettyClient = getty.NewUDPClient( unconnectedClient.gettyClient = getty.NewUDPPEndPoint(
getty.WithLocalAddress(gxnet.HostAddress(net.IPv4zero.String(), 0)),
)
unconnectedClient.gettyClient.RunEventLoop(newSession)
unconnectedClient.serverAddr = net.UDPAddr{IP: net.ParseIP(conf.ServerHost), Port: conf.ServerPort}
connectedClient.gettyClient = getty.NewUDPClient(
getty.WithServerAddress(gxnet.HostAddress(conf.ServerHost, conf.ServerPort)), getty.WithServerAddress(gxnet.HostAddress(conf.ServerHost, conf.ServerPort)),
getty.WithConnectionNumber((int)(conf.ConnectionNum)), getty.WithConnectionNumber((int)(conf.ConnectionNum)),
) )
client.gettyClient.RunEventLoop(newSession) connectedClient.gettyClient.RunEventLoop(newSession)
client.serverAddr = net.UDPAddr{IP: net.ParseIP(conf.ServerHost), Port: conf.ServerPort}
} }
func uninitClient() { func uninitClient() {
client.close() connectedClient.close()
unconnectedClient.close()
} }
func initSignal() { func initSignal() {
...@@ -147,7 +172,7 @@ func initSignal() { ...@@ -147,7 +172,7 @@ func initSignal() {
} }
} }
func echo(serverAddr *net.UDPAddr) { func echo(client *EchoClient) {
var ( var (
pkg EchoPackage pkg EchoPackage
ctx getty.UDPContext ctx getty.UDPContext
...@@ -162,7 +187,7 @@ func echo(serverAddr *net.UDPAddr) { ...@@ -162,7 +187,7 @@ func echo(serverAddr *net.UDPAddr) {
pkg.H.Len = (uint16)(len(pkg.B)) + 1 pkg.H.Len = (uint16)(len(pkg.B)) + 1
ctx.Pkg = &pkg ctx.Pkg = &pkg
ctx.PeerAddr = serverAddr ctx.PeerAddr = &(client.serverAddr)
if session := client.selectSession(); session != nil { if session := client.selectSession(); session != nil {
err := session.WritePkg(ctx, WritePkgTimeout) err := session.WritePkg(ctx, WritePkgTimeout)
...@@ -174,27 +199,29 @@ func echo(serverAddr *net.UDPAddr) { ...@@ -174,27 +199,29 @@ func echo(serverAddr *net.UDPAddr) {
} }
} }
func test() { func testEchoClient(client *EchoClient) {
var ( var (
cost int64 cost int64
serverAddr net.UDPAddr counter gxtime.CountWatch
counter gxtime.CountWatch
) )
for { for {
if client.isAvailable() { if unconnectedClient.isAvailable() {
break break
} }
time.Sleep(1e6) time.Sleep(3e9)
} }
serverAddr = net.UDPAddr{IP: net.ParseIP(conf.ServerHost), Port: conf.ServerPort}
counter.Start() counter.Start()
for i := 0; i < conf.EchoTimes; i++ { for i := 0; i < conf.EchoTimes; i++ {
echo(&serverAddr) echo(&unconnectedClient)
} }
cost = counter.Count() cost = counter.Count()
log.Info("after loop %d times, echo cost %d ms", conf.EchoTimes, cost/1e6) log.Info("after loop %d times, client:%s echo cost %d ms",
gxlog.CInfo("after loop %d times, echo cost %d ms", conf.EchoTimes, cost/1e6) conf.EchoTimes, client.gettyClient.EndPointType(), cost/1e6)
}
func test() {
testEchoClient(&unconnectedClient)
testEchoClient(&connectedClient)
} }
...@@ -38,7 +38,7 @@ FailFastTimeout = "3s" ...@@ -38,7 +38,7 @@ FailFastTimeout = "3s"
UdpWBufSize = 65536 UdpWBufSize = 65536
PkgRQSize = 512 PkgRQSize = 512
PkgWQSize = 256 PkgWQSize = 256
UdpReadTimeout = "1s" UdpReadTimeout = "10s"
UdpWriteTimeout = "5s" UdpWriteTimeout = "5s"
WaitTimeout = "1s" WaitTimeout = "1s"
MaxMsgLen = 128 MaxMsgLen = 128
......
...@@ -92,8 +92,8 @@ func newSession(session getty.Session) error { ...@@ -92,8 +92,8 @@ func newSession(session getty.Session) error {
udpConn.SetReadBuffer(conf.GettySessionParam.UdpRBufSize) udpConn.SetReadBuffer(conf.GettySessionParam.UdpRBufSize)
udpConn.SetWriteBuffer(conf.GettySessionParam.UdpWBufSize) udpConn.SetWriteBuffer(conf.GettySessionParam.UdpWBufSize)
session.SetMaxMsgLen(conf.GettySessionParam.MaxMsgLen)
session.SetName(conf.GettySessionParam.SessionName) session.SetName(conf.GettySessionParam.SessionName)
session.SetMaxMsgLen(conf.GettySessionParam.MaxMsgLen)
session.SetPkgHandler(NewEchoPackageHandler()) session.SetPkgHandler(NewEchoPackageHandler())
session.SetEventListener(newEchoMessageHandler()) session.SetEventListener(newEchoMessageHandler())
session.SetRQLen(conf.GettySessionParam.PkgRQSize) session.SetRQLen(conf.GettySessionParam.PkgRQSize)
...@@ -129,7 +129,7 @@ func initServer() { ...@@ -129,7 +129,7 @@ func initServer() {
} }
for _, port := range portList { for _, port := range portList {
addr = gxnet.HostAddress2(conf.Host, port) addr = gxnet.HostAddress2(conf.Host, port)
server = getty.NewUDPPServer( server = getty.NewUDPPEndPoint(
getty.WithLocalAddress(addr), getty.WithLocalAddress(addr),
) )
// run server // run server
......
...@@ -25,7 +25,7 @@ FailFastTimeout = "3s" ...@@ -25,7 +25,7 @@ FailFastTimeout = "3s"
UdpWBufSize = 524288 UdpWBufSize = 524288
PkgRQSize = 1024 PkgRQSize = 1024
PkgWQSize = 512 PkgWQSize = 512
UdpReadTimeout = "1s" UdpReadTimeout = "10s"
UdpWriteTimeout = "5s" UdpWriteTimeout = "5s"
WaitTimeout = "1s" WaitTimeout = "1s"
MaxMsgLen = 128 MaxMsgLen = 128
......
...@@ -96,8 +96,8 @@ func newSession(session getty.Session) error { ...@@ -96,8 +96,8 @@ func newSession(session getty.Session) error {
tcpConn.SetWriteBuffer(conf.GettySessionParam.TcpWBufSize) tcpConn.SetWriteBuffer(conf.GettySessionParam.TcpWBufSize)
} }
session.SetMaxMsgLen(conf.GettySessionParam.MaxMsgLen)
session.SetName(conf.GettySessionParam.SessionName) session.SetName(conf.GettySessionParam.SessionName)
session.SetMaxMsgLen(conf.GettySessionParam.MaxMsgLen)
session.SetPkgHandler(NewEchoPackageHandler()) session.SetPkgHandler(NewEchoPackageHandler())
session.SetEventListener(newEchoMessageHandler()) session.SetEventListener(newEchoMessageHandler())
session.SetRQLen(conf.GettySessionParam.PkgRQSize) session.SetRQLen(conf.GettySessionParam.PkgRQSize)
......
...@@ -101,8 +101,8 @@ func newSession(session getty.Session) error { ...@@ -101,8 +101,8 @@ func newSession(session getty.Session) error {
tcpConn.SetWriteBuffer(conf.GettySessionParam.TcpWBufSize) tcpConn.SetWriteBuffer(conf.GettySessionParam.TcpWBufSize)
} }
session.SetMaxMsgLen(conf.GettySessionParam.MaxMsgLen)
session.SetName(conf.GettySessionParam.SessionName) session.SetName(conf.GettySessionParam.SessionName)
session.SetMaxMsgLen(conf.GettySessionParam.MaxMsgLen)
session.SetPkgHandler(NewEchoPackageHandler()) session.SetPkgHandler(NewEchoPackageHandler())
session.SetEventListener(newEchoMessageHandler()) session.SetEventListener(newEchoMessageHandler())
session.SetRQLen(conf.GettySessionParam.PkgRQSize) session.SetRQLen(conf.GettySessionParam.PkgRQSize)
......
...@@ -96,8 +96,8 @@ func newSession(session getty.Session) error { ...@@ -96,8 +96,8 @@ func newSession(session getty.Session) error {
tcpConn.SetWriteBuffer(conf.GettySessionParam.TcpWBufSize) tcpConn.SetWriteBuffer(conf.GettySessionParam.TcpWBufSize)
} }
session.SetMaxMsgLen(conf.GettySessionParam.MaxMsgLen)
session.SetName(conf.GettySessionParam.SessionName) session.SetName(conf.GettySessionParam.SessionName)
session.SetMaxMsgLen(conf.GettySessionParam.MaxMsgLen)
session.SetPkgHandler(NewEchoPackageHandler()) session.SetPkgHandler(NewEchoPackageHandler())
session.SetEventListener(newEchoMessageHandler()) session.SetEventListener(newEchoMessageHandler())
session.SetRQLen(conf.GettySessionParam.PkgRQSize) session.SetRQLen(conf.GettySessionParam.PkgRQSize)
......
...@@ -101,8 +101,8 @@ func newSession(session getty.Session) error { ...@@ -101,8 +101,8 @@ func newSession(session getty.Session) error {
tcpConn.SetWriteBuffer(conf.GettySessionParam.TcpWBufSize) tcpConn.SetWriteBuffer(conf.GettySessionParam.TcpWBufSize)
} }
session.SetMaxMsgLen(conf.GettySessionParam.MaxMsgLen)
session.SetName(conf.GettySessionParam.SessionName) session.SetName(conf.GettySessionParam.SessionName)
session.SetMaxMsgLen(conf.GettySessionParam.MaxMsgLen)
session.SetPkgHandler(NewEchoPackageHandler()) session.SetPkgHandler(NewEchoPackageHandler())
session.SetEventListener(newEchoMessageHandler()) session.SetEventListener(newEchoMessageHandler())
session.SetRQLen(conf.GettySessionParam.PkgRQSize) session.SetRQLen(conf.GettySessionParam.PkgRQSize)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment