echo_server.go 2.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. package main
  2. import (
  3. "fmt"
  4. "net"
  5. "os"
  6. "os/signal"
  7. "syscall"
  8. "time"
  9. "git.wenlab.co/joe/nnet"
  10. "git.wenlab.co/joe/nnet/cpn"
  11. )
  12. const (
  13. SERVER_ADDR = "127.0.0.1:3200"
  14. WS_PATH = "/echo"
  15. )
  16. type ServerSessionCb struct {
  17. }
  18. func (self *ServerSessionCb) OnClosed(ses nnet.ISession, reason int32) {
  19. fmt.Println("client quit:", ses.GetRawConn().RemoteAddr())
  20. }
  21. func (self *ServerSessionCb) OnConnected(ses nnet.ISession) (bool, int32) {
  22. fmt.Fprintf(os.Stdout, "connected:%v\n", ses.GetRawConn().RemoteAddr())
  23. return true, 0
  24. }
  25. func (self *ServerSessionCb) OnMessage(ses nnet.ISession, pkt nnet.IPacket) bool {
  26. p, ok := pkt.(*EchoPacket)
  27. if !ok {
  28. return false
  29. }
  30. _, _ = fmt.Fprintf(os.Stdout, "received[%v] id<%v>, msg<%v>\n", time.Now().Format("15:04:05"), p.Id, p.Msg)
  31. _ = ses.AWrite(p, time.Second)
  32. return true
  33. }
  34. func (self *ServerSessionCb) OnHeartbeat(ses nnet.ISession) bool {
  35. return true
  36. }
  37. func start_tcp_server() {
  38. __start_server(func() nnet.IHub {
  39. listener, err := nnet.Listen(SERVER_ADDR)
  40. if err != nil {
  41. panic(err)
  42. }
  43. tcpListener, ok := listener.(*net.TCPListener)
  44. if !ok {
  45. panic("interface")
  46. }
  47. return cpn.NewTcpServer(&nnet.DefHubConfig, &ServerSessionCb{}, &TcpProtocol{}, tcpListener)
  48. })
  49. }
  50. func start_ws_server() {
  51. __start_server(func() nnet.IHub {
  52. return cpn.NewWsServer(&nnet.DefHubConfig, &ServerSessionCb{}, &WsProtocol{}, SERVER_ADDR, WS_PATH, nil)
  53. })
  54. }
  55. func __start_server(fn func() nnet.IHub) {
  56. server := fn()
  57. go func() {
  58. err := server.Start()
  59. if err != nil {
  60. panic(err)
  61. }
  62. }()
  63. fmt.Println("server started.")
  64. ch := make(chan os.Signal)
  65. signal.Notify(ch, syscall.SIGINT)
  66. fmt.Println("received signal:", <-ch)
  67. server.Stop()
  68. }
  69. func main() {
  70. param := "tcpserver"
  71. if len(os.Args) > 1 {
  72. param = os.Args[1]
  73. }
  74. switch param {
  75. case "tcpserver":
  76. start_tcp_server()
  77. case "tcpclient":
  78. start_tcp_client()
  79. case "wsserver":
  80. start_ws_server()
  81. case "wsclient":
  82. start_ws_client()
  83. default:
  84. fmt.Fprintf(os.Stderr, "usage:%v [tcpserver|tcpclient|wsserver|wsclient]\n", os.Args[0])
  85. }
  86. }