我是golang和websocket的新手。
我正在尝试编写一个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)
}
答案 0 :(得分:1)
尝试包websocket。
以下是来自Godoc的简单示例:
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...
}
答案 1 :(得分:0)
谢谢大家帮助我回答。 对不起,这里的答复非常晚。
你们两个人的回答非常有帮助,而且我学到了很多东西。
最后,我还找到了在不使用大猩猩的情况下实现相同结果的简单方法,这里是我的代码:
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)
}
}