Чтобы получить широковещательное сообщение от группы к нескольким обработчикам URL-адресов http, я пытаюсь зарегистрировать эти обработчики URL-адресов http, с кодом ниже в main.go
:
type webSocketHandler func(http.ResponseWriter, *http.Request)
type threadSafeSlice struct {
sync.Mutex
handlers []*webSocketHandler
}
var sliceOfHandlers threadSafeSlice
func (slice *threadSafeSlice) push(handle *webSocketHandler) { //register
slice.Lock()
defer slice.Unlock()
slice.handlers = append(slice.handlers, handle)
}
где forWardMsgToClient()
- обработчик URL-адреса http, который необходимо зарегистрировать,
broadCastMessage()
goroutine может передавать сообщения нескольким forWardMsgToClient()
обработчикам, в следующем коде:
func main() {
go broadcastMessage()
http.HandleFunc("/websocket", forwardMsgToClient)
http.ListenAndServe(":3000", nil)
}
func forwardMsgToClient(w http.ResponseWriter, r *http.Request) {
conn, err := upgrader.Upgrade(w, r, nil)
for {
// Forward message to the client upon receiving a msg from publisher
}
}
Весь приведенный выше код находится в main.go
Но проблема в том, что для соответствующего клиента порождается процедура forwardMsgToClient()
после rw, e := l.Accept()
вызова ../go/src/net/http/server.go
.
Причина регистр (push()
) Функция обработчика URL-адреса http (forwardMsgToClient()
) заключается в том, чтобы broadcastMessage()
goroutine знал число каналов, создаваемых для всех обработчиков URL-адресов http, и удалял канал, когда Отмена регистрации функции обработчика URL-адреса http (forwardMsgToClient()
).
Немного нервничаю, если нам нужно изменить /go/src/net/http/server.go
для достижения этой цели
Как зарегистрировать (push()
) функцию обработчика http URL forwardMsgToClient()
в sliceOfHandlers.handlers
?