Я новичок в 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, а не на веб-сокете (для этого вы можете обновить его до веб-сокета, например, с помощью гориллы)
во-вторых, до того, как клиент сделает запрос, нет возможности ответить ему, потому что у вас нет с ним связи (дааа)
Попробуйте пакет веб-сокет.
Вот простой пример из Годок:
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)
}
}
Это простой обработчик HTTP. Нет кода, реализующего протокол веб-сокета. Рассмотрите возможность использования горилла пакет.