首页 > 解决方案 > 服务器启动后如何更改 http.Handle() 中的处理程序?

问题描述

"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))

标签: httpgosocket.io

解决方案


应用程序不能在多路复用器中交换处理程序,但它可以编写一个在其他处理程序之间交换的处理程序:

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)
}

像这样注册它:

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

在任何时候,应用程序都可以调用 s.setHandler 来换入一个新的处理程序。


推荐阅读