Как активно отправлять сообщения с сервера golang websocket клиенту

Я новичок в golang и websocket.

Я пытаюсь написать сервер веб-сокета, который может активно отправлять сообщения клиенту после завершения рукопожатия.

но мой сервер просто отправит сообщение клиенту, когда получит запрос от клиента.

Кто-нибудь знает, как реализовать эту функцию или где я могу найти соответствующий ответ?

Большое спасибо.

исходный код выглядит следующим образом:

package main

import (
    "log"
    "net/http"
)

func handler(w http.ResponseWriter, req *http.Request) {
    w.Header().Set("Content-Type", "text/plain")
    w.Write([]byte("Hi, the handshake is completed.\n"))
    w.Write([]byte("Let's start to talk something.\n"))
}

func main() {
    http.HandleFunc("/", handler)
    log.Printf("Start to listen on 443.")
    err := http.ListenAndServeTLS(":443", "server.crt", "server.key", nil)
    log.Fatal(err)
}

Это простой обработчик HTTP. Нет кода, реализующего протокол веб-сокета. Рассмотрите возможность использования горилла пакет.

Cerise Limón 24.05.2018 07:59
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
4
1
4 568
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Прежде всего, ваш сервер находится на http, а не на веб-сокете (для этого вы можете обновить его до веб-сокета, например, с помощью гориллы)

во-вторых, до того, как клиент сделает запрос, нет возможности ответить ему, потому что у вас нет с ним связи (дааа)

Ответ принят как подходящий

Попробуйте пакет веб-сокет.

Вот простой пример из Годок:

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}

func handler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        log.Println(err)
        return
    }
    defer conn.Close()

    msg := []byte("Let's start to talk something.")
    err = conn.WriteMessage(websocket.TextMessage, msg)
    if err != nil {
        log.Println(err)
    }

    // do other stuff...
}

Спасибо вам всем за то, что помогли мне ответить. и извините за очень поздний ответ здесь.

Ваш ответ очень полезен, и я многому научился.

Наконец, я также нашел простой способ достичь того же результата без использования гориллы, вот мой код:

package main

import (
    "fmt"
    "log"
    "net/http"
    "golang.org/x/net/websocket"
)

func Echo(ws *websocket.Conn) {
    var err error
    msg := `Hi, the handshake it complete!`

    for {
        if err = websocket.Message.Send(ws, msg); err != nil {
            fmt.Println("Can't send")
        } else {
            fmt.Println("Sending")
        }
    }
}

func main() {
    http.Handle("/", websocket.Handler(Echo))

    if err := http.ListenAndServeTLS("10.10.10.10:1010", "server.crt", "server.key", nil); err != nil {
        log.Fatal("ListenAndServe:", err)
    }
}

Другие вопросы по теме