向新客户端发送 Websocket 消息

时间:2021-01-23 08:23:15

标签: go websocket gorilla

我正在使用 Go 和 Gorilla websocket 创建一个聊天 API。我希望我的用户在建立 websocket 连接时收到最后 10 条消息。但是我找不到一个简单的方法来做到这一点。我只想将我的消息数组中的每条消息发送到新客户端。有没有一种简单的方法可以在没有集线器的情况下编辑我的代码?这是我的代码:

package messenger

import (
    "../config"
    "fmt"
    "github.com/go-chi/chi"
    "github.com/gorilla/websocket"
    log "github.com/sirupsen/logrus"
    "net/http"
)

func InitRouter() http.Handler {
    r := chi.NewRouter()
    r.Get("/", getWebsocket)
    return r
}

var clients = make(map[*websocket.Conn]bool) // connected clients
var broadcast = make(chan Message)           // broadcast channel

var messages = []Message{}

// Configure the upgrader
var upgrader = websocket.Upgrader{}

func getWebsocket(w http.ResponseWriter, r *http.Request) {
    // Upgrade initial GET request to a websocket
    ws, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Fatal(err)
    }
    // Make sure we close the connection when the function returns
    defer ws.Close()

    // Register our new client
    clients[ws] = true

    for {
        var msg Message
        // Read in a new message as JSON and map it to a Message object
        err := ws.ReadJSON(&msg)
        if err != nil {
            log.Printf("error: %v", err)
            delete(clients, ws)
            break
        }
        // Send the newly received message to the broadcast channel
        broadcast <- msg
        saveMessage(msg)
    }
}

func HandleMessages() {
    for {
        // Grab the next message from the broadcast channel
        msg := <-broadcast
        // Send it out to every client that is currently connected
        for client := range clients {
            err := client.WriteJSON(msg)
            if err != nil {
                log.Printf("error: %v", err)
                client.Close()
                delete(clients, client)
            }
        }
    }
}

func saveMessage(m Message) {
    if len(messages) >= config.Conf.MessageAmount {
        messages = messages[1:]
    }
    messages = append(messages, m)
    fmt.Println(messages)
}

1 个答案:

答案 0 :(得分:0)

好吧,看来我做到了。我刚刚创建了一个新函数,并通过传递新创建的 Websocket 的 getWebsocket 函数调用它。这是新功能:

func serveInitialMessages(ws *websocket.Conn) {
for _, m := range messages {
    fmt.Println(m)
    err := ws.WriteJSON(m)
    if err != nil {
        fmt.Println(err)
    }
}

}