From ab404c44e104c4610920d7229520bda02f2e9a49 Mon Sep 17 00:00:00 2001 From: boyce Date: Mon, 28 Jan 2019 14:43:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BC=98=E5=8C=96websocket=E6=9C=8D=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Test/main.go | 6 +++--- network/websocketserver.go | 43 ++++++++++++++++++++++++++++++-------- rpc/server.go | 11 ++++++++-- 3 files changed, 46 insertions(+), 14 deletions(-) diff --git a/Test/main.go b/Test/main.go index ac06576..256ecd4 100644 --- a/Test/main.go +++ b/Test/main.go @@ -61,7 +61,7 @@ func (ws *CTest) RPC_LogTicker2(args *CTestData, quo *CTestData) error { return nil } -func (ws *CTest) Http_LogTicker2(request *sysservice.HttpRequest, resp *sysservice.HttpRespone) error { +func (ws *CTest) HTTP_LogTicker2(request *sysservice.HttpRequest, resp *sysservice.HttpRespone) error { resp.Respone = "hello world!" return nil @@ -111,8 +111,8 @@ func main() { var receiver CMessageReceiver wsservice := sysservice.NewWSServerService("/ws", 1314, &receiver, false) test := NewCTest(0) - httpserver := sysservice.NewHttpServerService(80) - server.SetupService(wsservice, test, httpserver) + httpserver := sysservice.NewHttpServerService(9120) + server.SetupService(test, httpserver, wsservice) server.Init() server.Start() diff --git a/network/websocketserver.go b/network/websocketserver.go index 2ce0c80..36ed88d 100644 --- a/network/websocketserver.go +++ b/network/websocketserver.go @@ -4,8 +4,11 @@ import ( "fmt" "net/http" "sync" + "time" + "github.com/gorilla/mux" "github.com/gorilla/websocket" + "github.com/gotoxu/cors" ) type IWebsocketServer interface { @@ -39,14 +42,11 @@ type WebsocketServer struct { bEnableCompression bool locker sync.Mutex messageReciver IMessageReceiver + + httpserver *http.Server } func (slf *WebsocketServer) wsHandler(w http.ResponseWriter, r *http.Request) { - /*if r.Header.Get("Origin") != "http://"+r.Host { - http.Error(w, "Origin not allowed", 403) - return - } - */ conn, err := websocket.Upgrade(w, r, w.Header(), 1024, 1024) if err != nil { http.Error(w, "Could not open websocket connection", http.StatusBadRequest) @@ -83,14 +83,24 @@ func (slf *WebsocketServer) Init(pattern string, port uint16, messageReciver IMe slf.mapClient = make(map[uint64]*WSClient) slf.messageReciver = messageReciver - http.HandleFunc(slf.pattern, slf.wsHandler) + //http.HandleFunc(slf.pattern, slf.wsHandler) } func (slf *WebsocketServer) startListen() { - address := fmt.Sprintf(":%d", slf.port) - err := http.ListenAndServe(address, nil) + + listenPort := fmt.Sprintf(":%d", slf.port) + + slf.httpserver = &http.Server{ + Addr: listenPort, + Handler: slf.initRouterHandler(), + ReadTimeout: 10 * time.Second, + WriteTimeout: 10 * time.Second, + MaxHeaderBytes: 1 << 20, + } + + err := slf.httpserver.ListenAndServe() if err != nil { - fmt.Printf("%v", err) + fmt.Printf("http.ListenAndServe(%d, nil) error\n", slf.port) } } @@ -121,3 +131,18 @@ func (slf *WebsocketServer) SendMsg(clientid uint64, messageType int, msg []byte func (slf *WebsocketServer) Stop() { } + +func (slf *WebsocketServer) initRouterHandler() http.Handler { + r := mux.NewRouter() + /*r.HandleFunc("/{server:[a-zA-Z0-9]+}/{method:[a-zA-Z0-9]+}", func(w http.ResponseWriter, r *http.Request) { + slf.wsHandler(w, r) + }) + */ + r.HandleFunc(slf.pattern, func(w http.ResponseWriter, r *http.Request) { + slf.wsHandler(w, r) + }) + + cors := cors.AllowAll() + //return cors.Handler(gziphandler.GzipHandler(r)) + return cors.Handler(r) +} diff --git a/rpc/server.go b/rpc/server.go index f207f94..a7530d5 100644 --- a/rpc/server.go +++ b/rpc/server.go @@ -277,9 +277,16 @@ func (server *Server) register(rcvr interface{}, name string, prefix string, use return errors.New(str) } - if _, dup := server.serviceMap.LoadOrStore(sname, s); dup { - return errors.New("rpc: service already defined: " + sname) + //将已经注册的消息加载 + svci, ok := server.serviceMap.Load(sname) + if ok { + svc := svci.(*service) + for key, value := range svc.method { + s.method[key] = &methodType{method: value.method, ArgType: value.ArgType, ReplyType: value.ReplyType} + } } + + server.serviceMap.Store(sname, s) return nil }