Go lang Redis PubSub在不同的go路线上进行发布和订阅

时间:2016-08-31 05:00:04

标签: go websocket redis publish-subscribe

是编程语言的新手,我需要使用websocket创建Redis PubSub。

我的参考代码在这里 https://github.com/vortec/orchestrate

使用以下库

" golang.org/x/net/websocket"

" github.com/garyburd/redigo/redis"

一切都像这样对我有用,但我不明白什么是" websocket.Handler(handleWSConnection)"这里。 / ws-subscribe和/ ws-publish需要两个不同的go路由。我不知道这个概念有什么不对吗?

怀疑

  1. 我可以这样做,http.HandleFunc(" / ws",handleWSConnection)//尝试这种方式但是在调用handleWConnection时没有足够的参数" 有没有办法调用" handleWSConnection()"作为正常功能。

  2. 有关如何将/ ws-publish写为不同的路线的任何建议

  3. 以下是我的代码

    main function 
    func (wsc *WSConnection) ReadWebSocket() {
        for {
            var json_data []byte
            var message WSMessage
    
            // Receive data from WebSocket
            err := websocket.Message.Receive(wsc.socket, &json_data)
            if err != nil {
                return
            }
    
            // Parse JSON data
            err = json.Unmarshal(json_data, &message)
            if err != nil {
                return
            }
            switch message.Action {
            case "SUBSCRIBE":
                wsc.subscribe.Subscribe(message.Channel)
            case "UNSUBSCRIBE":
                wsc.subscribe.Unsubscribe(message.Channel)
            case "PUBLISH":
                wsc.publish.Conn.Do("PUBLISH", message.Channel, message.Data)
            }
        }
    }
    func handleWSConnection(socket *websocket.Conn) {
        wsc := &WSConnection {socket: socket}
        defer wsc.Uninitialize()
        wsc.Initialize()
        go wsc.ProxyRedisSubscribe()
        wsc.ReadWebSocket()
    }
    func serveWeb() {
        http.Handle("/ws", websocket.Handler(handleWSConnection)) // I need to call this route as funciton 
        if err := http.ListenAndServe(":9000", nil); err != nil {
            log.Fatal("ListenAndServe:", err)
        }
    }
    

1 个答案:

答案 0 :(得分:0)

完成以下方式,我不知道这是正确的方法吗

http.HandleFunc("/publish", publishHandler)


func publishHandler(conn http.ResponseWriter, req *http.Request) {
     log.Println("PUBLISH HANDLER")
     wsHandler := websocket.Handler(func(ws *websocket.Conn) {
            handleWSConnection(ws)
        })
     wsHandler.ServeHTTP(conn, req)
}