http - 服务器启动后如何更改 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))
解决方案
应用程序不能在多路复用器中交换处理程序,但它可以编写一个在其他处理程序之间交换的处理程序:
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 来换入一个新的处理程序。
推荐阅读
- html - 无法更改表格标题边框 Codeigniter Bootsrap
- ios - Google 表格 - 使脚本在 iOS 表格应用程序上运行
- xml - odoo xml t 值 = html 标记
- python - 类方法中带有验证装饰器的 TypeError
- button - 初始化或渲染后Paypal智能按钮样式修改
- javascript - 如何 post props redux React
- google-cloud-platform - 将 GCP 中的磁盘映射到 Windows 中的操作系统磁盘
- vue.js - 我如何从子组件 vuejs 运行方法
- r - 在 R 中创建 GIF 时出现帧顺序问题(库:“magick”和“purrr”)
- angular - 当两级嵌套 cva 无效时,父表单无效