服务器启动后如何在http.Handle()中更改处理程序?

use*_*692 2 http go socket.io

"github.com/googollee/go-socket.io"在Go中使用socketio 。由于某种原因,我必须创建一个新的* socketio.server并将其注册到"/static/"已经在旧的* socketio.server中注册的服务器。

这意味着http.Handle("/socket.io/", ioserver)在服务器启动后,我必须替换处理程序ioserver 。

下面是我的代码的一部分,当某些事情发生时,我将创建一个新的ioserver。我希望新的ioserver成为其中的处理程序http.Handle("/socket.io/", ioserver)

ioserver, _ = socketio.NewServer(nil)
http.Handle("/socket.io/", ioserver)
log.Fatal(http.ListenAndServe(":81", nil))
Run Code Online (Sandbox Code Playgroud)

小智 6

应用程序无法在多路复用器中交换处理程序,但可以编写在其他处理程序之间交换的处理程序:

type swapper struct {
    mu sync.Mutex
    h http.Handler
}

func (s *swapper) setHandler(h http.Handler) {
    s.mu.Lock()
    s.h = h
    s.mu.Unlock()
}

func (w *swapper) ServeHTTP(w http.ResponseWriter, r *http.Request) {
    s.mu.Lock()
    h := s.h
    s.mu.Unlock()
    h.ServeHTTP(w, r)
}
Run Code Online (Sandbox Code Playgroud)

像这样注册:

ioserver, _ = socketio.NewServer(nil)
s := &swapper{}
s.setHandler(ioserver)
http.Handle("/socket.io/", s)
log.Fatal(http.ListenAndServe(":81", nil))
Run Code Online (Sandbox Code Playgroud)

应用程序可以随时调用s.setHandler来交换新的处理程序。