func client() { pipe := cellnet.NewEventPipe() p := socket.NewConnector(pipe).Start("127.0.0.1:7201") rpc.InstallClient(p) socket.RegisterSessionMessage(p, coredef.SessionConnected{}, func(content interface{}, ses cellnet.Session) { rpc.Call(p, &coredef.TestEchoACK{ Content: "rpc hello", }, func(msg *coredef.TestEchoACK) { log.Debugln("client recv", msg.Content) signal.Done(1) }) }) pipe.Start() signal.WaitAndExpect(1, "not recv data") }
func StartGateConnector(pipe cellnet.EventPipe, addressList []string) { gateConnArray = make([]cellnet.Peer, len(addressList)) for index, addr := range addressList { conn := socket.NewConnector(pipe).Start(addr) gateConnArray[index] = conn gateIndex := new(int) *gateIndex = index // 广播 socket.RegisterSessionMessage(conn, coredef.UpstreamACK{}, func(content interface{}, ses cellnet.Session) { msg := content.(*coredef.UpstreamACK) // 生成派发的消息 // TODO 用PostData防止多重嵌套? // 调用已注册的回调 conn.CallData(&relayEvent{ SessionEvent: socket.NewSessionEvent(msg.GetMsgID(), ses, msg.Data), ClientID: msg.GetClientID(), }) }) } }
// 客户端 func client() { pipe := cellnet.NewEventPipe() evq := socket.NewConnector(pipe).Start("127.0.0.1:7101") socket.RegisterSessionMessage(evq, "coredef.SessionConnected", func(content interface{}, ses cellnet.Session) { signal.Done(1) ack := &coredef.TestEchoACK{ Content: "hello", } ses.Send(ack) log.Debugf("client send: %s\n", ack.String()) }) socket.RegisterSessionMessage(evq, "coredef.TestEchoACK", func(content interface{}, ses cellnet.Session) { msg := content.(*coredef.TestEchoACK) log.Debugln("client recv:", msg.String()) signal.Done(3) }) pipe.Start() signal.WaitAndExpect(1, "not connceted to router") signal.WaitAndExpect(2, "not recv client msg") signal.WaitAndExpect(3, "not recv server msg") }
func client() { pipe := cellnet.NewEventPipe() evq := socket.NewConnector(pipe).Start("127.0.0.1:7201") socket.RegisterSessionMessage(evq, "gamedef.TestEchoACK", func(content interface{}, ses cellnet.Session) { msg := content.(*gamedef.TestEchoACK) log.Debugln("client recv:", msg.String()) signal.Done(1) }) socket.RegisterSessionMessage(evq, "gamedef.SessionConnected", func(content interface{}, ses cellnet.Session) { ses.Send(&gamedef.TestEchoACK{ Content: "hello", }) }) pipe.Start() signal.WaitAndExpect(1, "not recv data") }
func client() { pipe := cellnet.NewEventPipe() p := socket.NewConnector(pipe) p.SetName("client") p.Start("127.0.0.1:9201") socket.RegisterSessionMessage(p, "gamedef.SessionConnected", func(content interface{}, ses cellnet.Session) { rpc.Call(p, &gamedef.TestEchoACK{ Content: "rpc async call", }, func(msg *gamedef.TestEchoACK) { log.Debugln("client recv", msg.Content) signal.Done(1) }) }) pipe.Start() signal.WaitAndExpect(1, "not recv data") }
// 客户端 func client() { pipe := cellnet.NewEventPipe() evq := socket.NewConnector(pipe).Start("127.0.0.1:7101") socket.RegisterSessionMessage(evq, coredef.SessionConnected{}, func(content interface{}, ses cellnet.Session) { ack := &coredef.TestEchoACK{ Content: proto.String("hello"), } ses.Send(ack) log.Printf("client send: %s\n", ack.String()) }) socket.RegisterSessionMessage(evq, coredef.TestEchoACK{}, func(content interface{}, ses cellnet.Session) { msg := content.(*coredef.TestEchoACK) log.Println("client recv:", msg.String()) done <- true }) pipe.Start() <-done }
// 客户端连接上后, 主动断开连接, 确保连接正常关闭 func connClose() { pipe := cellnet.NewEventPipe() p := socket.NewConnector(pipe).Start("127.0.0.1:7235") socket.RegisterSessionMessage(p, coredef.SessionConnected{}, func(ses cellnet.Session, content interface{}) { // 连接上发包,告诉服务器不要断开 ses.Send(&coredef.TestEchoACK{ Content: proto.String("noclose"), }) }) socket.RegisterSessionMessage(p, coredef.TestEchoACK{}, func(ses cellnet.Session, content interface{}) { msg := content.(*coredef.TestEchoACK) log.Println("client recv:", msg.String()) done <- 1 // 客户端主动断开 ses.Close() }) socket.RegisterSessionMessage(p, coredef.SessionClosed{}, func(ses cellnet.Session, content interface{}) { log.Println("close ok!") // 正常断开 done <- 2 }) pipe.Start() // 收到回包 if <-done != 1 { log.Panicln("test failed, not recv msg") } // 断开正常 if <-done != 2 { log.Panicln("test failed, not close") } fmt.Println("connected close test done!") }
// 后台服务器到router的连接 func StartBackendConnector(pipe cellnet.EventPipe, addressList []string, peerName string, svcName string) { routerConnArray = make([]cellnet.Peer, len(addressList)) if len(addressList) == 0 { log.Warnf("empty router address list") return } for index, addr := range addressList { peer := socket.NewConnector(pipe) peer.SetName(peerName) peer.(cellnet.Connector).SetAutoReconnectSec(defaultReconnectSec) peer.Start(addr) routerConnArray[index] = peer // 连上网关时, 发送自己的服务器名字进行注册 socket.RegisterSessionMessage(peer, "coredef.SessionConnected", func(content interface{}, ses cellnet.Session) { ses.Send(&coredef.RegisterRouterBackendACK{ Name: svcName, }) }) // 广播 socket.RegisterSessionMessage(peer, "coredef.UpstreamACK", func(content interface{}, ses cellnet.Session) { msg := content.(*coredef.UpstreamACK) // 生成派发的消息 // TODO 用PostData防止多重嵌套? // 调用已注册的回调 peer.CallData(&relayEvent{ SessionEvent: socket.NewSessionEvent(msg.MsgID, ses, msg.Data), ClientID: msg.ClientID, }) }) } }
// 多连接收封包后被服务器关闭, 确保收到封包 func multiConn() { pipe := cellnet.NewEventPipe() // 同步量 var endAcc sync.WaitGroup // 启动N个连接 for i := 0; i < connCount; i++ { endAcc.Add(1) p := socket.NewConnector(pipe).Start("127.0.0.1:7235") p.SetName(fmt.Sprintf("%d", i)) socket.RegisterSessionMessage(p, coredef.TestEchoACK{}, func(ses cellnet.Session, content interface{}) { msg := content.(*coredef.TestEchoACK) log.Println("client recv:", msg.String()) // 正常收到 endAcc.Done() }) socket.RegisterSessionMessage(p, coredef.SessionConnected{}, func(ses cellnet.Session, content interface{}) { id, _ := strconv.Atoi(ses.FromPeer().Name()) // 连接上发包 ses.Send(&coredef.TestEchoACK{ Content: proto.String(fmt.Sprintf("data#%d", id)), }) }) } pipe.Start() // 等待完成 endAcc.Wait() fmt.Println("multi connection close test done!") }
// 客户端连接上后, 主动断开连接, 确保连接正常关闭 func testConnActiveClose() { pipe := cellnet.NewEventPipe() p := socket.NewConnector(pipe).Start("127.0.0.1:7201") socket.RegisterSessionMessage(p, coredef.SessionConnected{}, func(content interface{}, ses cellnet.Session) { signal.Done(1) // 连接上发包,告诉服务器不要断开 ses.Send(&coredef.TestEchoACK{ Content: proto.String("noclose"), }) }) socket.RegisterSessionMessage(p, coredef.TestEchoACK{}, func(content interface{}, ses cellnet.Session) { msg := content.(*coredef.TestEchoACK) log.Debugln("client recv:", msg.String()) signal.Done(2) // 客户端主动断开 ses.Close() }) socket.RegisterSessionMessage(p, coredef.SessionClosed{}, func(content interface{}, ses cellnet.Session) { log.Debugln("close ok!") // 正常断开 signal.Done(3) }) pipe.Start() signal.WaitAndExpect(1, "TestConnActiveClose not connected") signal.WaitAndExpect(2, "TestConnActiveClose not recv msg") signal.WaitAndExpect(3, "TestConnActiveClose not close") }
func client() { pipe := cellnet.NewEventPipe() evq := socket.NewConnector(pipe).Start(benchmarkAddress) socket.RegisterSessionMessage(evq, "gamedef.TestEchoACK", func(content interface{}, ses cellnet.Session) { ses.Send(&gamedef.TestEchoACK{}) }) socket.RegisterSessionMessage(evq, "gamedef.SessionConnected", func(content interface{}, ses cellnet.Session) { ses.Send(&gamedef.TestEchoACK{}) }) pipe.Start() }
// 接收封包后被断开 func testRecvDisconnected() { pipe := cellnet.NewEventPipe() p := socket.NewConnector(pipe).Start("127.0.0.1:7201") socket.RegisterSessionMessage(p, coredef.SessionConnected{}, func(content interface{}, ses cellnet.Session) { // 连接上发包 ses.Send(&coredef.TestEchoACK{ Content: proto.String("data"), }) signal.Done(1) }) socket.RegisterSessionMessage(p, coredef.TestEchoACK{}, func(content interface{}, ses cellnet.Session) { msg := content.(*coredef.TestEchoACK) log.Debugln("client recv:", msg.String()) signal.Done(2) }) socket.RegisterSessionMessage(p, coredef.SessionClosed{}, func(content interface{}, ses cellnet.Session) { // 断开 signal.Done(3) }) pipe.Start() signal.WaitAndExpect(1, "TestRecvDisconnected not connected") signal.WaitAndExpect(2, "TestRecvDisconnected not recv msg") signal.WaitAndExpect(3, "TestRecvDisconnected not closed") }
func client() { pipe := cellnet.NewEventPipe() p := socket.NewConnector(pipe).Start("127.0.0.1:7234") rpc.InstallClient(p) socket.RegisterSessionMessage(p, coredef.SessionConnected{}, func(content interface{}, ses cellnet.Session) { rpc.Call(p, &coredef.TestEchoACK{ Content: proto.String("rpc hello"), }, func(msg *coredef.TestEchoACK) { log.Println("client recv", msg.GetContent()) done <- true }) }) pipe.Start() }