package main import ( "fmt" "net" "os" "os/signal" "syscall" "time" "git.wenlab.co/joe/nnet" "git.wenlab.co/joe/nnet/cpn" ) const ( SERVER_ADDR = "127.0.0.1:3200" WS_PATH = "/echo" ) type ServerSessionCb struct { } func (self *ServerSessionCb) OnClosed(ses nnet.ISession, reason int32) { fmt.Println("client quit:", ses.GetRawConn().RemoteAddr()) } func (self *ServerSessionCb) OnConnected(ses nnet.ISession) (bool, int32) { fmt.Fprintf(os.Stdout, "connected:%v\n", ses.GetRawConn().RemoteAddr()) return true, 0 } func (self *ServerSessionCb) OnMessage(ses nnet.ISession, pkt nnet.IPacket) bool { p, ok := pkt.(*EchoPacket) if !ok { return false } _, _ = fmt.Fprintf(os.Stdout, "received[%v] id<%v>, msg<%v>\n", time.Now().Format("15:04:05"), p.Id, p.Msg) _ = ses.AWrite(p, time.Second) return true } func (self *ServerSessionCb) OnHeartbeat(ses nnet.ISession) bool { return true } func start_tcp_server() { __start_server(func() nnet.IHub { listener, err := nnet.Listen(SERVER_ADDR) if err != nil { panic(err) } tcpListener, ok := listener.(*net.TCPListener) if !ok { panic("interface") } return cpn.NewTcpServer(&nnet.DefHubConfig, &ServerSessionCb{}, &TcpProtocol{}, tcpListener) }) } func start_ws_server() { __start_server(func() nnet.IHub { return cpn.NewWsServer(&nnet.DefHubConfig, &ServerSessionCb{}, &WsProtocol{}, SERVER_ADDR, WS_PATH, nil) }) } func __start_server(fn func() nnet.IHub) { server := fn() go func() { err := server.Start() if err != nil { panic(err) } }() fmt.Println("server started.") ch := make(chan os.Signal) signal.Notify(ch, syscall.SIGINT) fmt.Println("received signal:", <-ch) server.Stop() } func main() { param := "tcpserver" if len(os.Args) > 1 { param = os.Args[1] } switch param { case "tcpserver": start_tcp_server() case "tcpclient": start_tcp_client() case "wsserver": start_ws_server() case "wsclient": start_ws_client() default: fmt.Fprintf(os.Stderr, "usage:%v [tcpserver|tcpclient|wsserver|wsclient]\n", os.Args[0]) } }