如何从Golang的WebSocket服务器主动向客户端发送消息

7

我是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)
}

3
这是一个普通的HTTP处理程序,没有实现WebSocket协议的代码。建议使用gorilla包(https://github.com/gorilla/websocket#readme)。 - Charlie Tumahai
3个回答

4

感谢你们的帮助回答我的问题。在这里,很抱歉我回复得非常晚。

你们给出的答案真的很有帮助,我学到了很多知识。

最终,我也发现了不使用Gorilla实现相同结果的简单方法,以下是我的代码:

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)
    }
}

2

尝试使用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
首先,您的服务器是http而不是websocket(您可以使用gorilla升级为websocket)。
其次,在客户端发出请求之前,无法响应他,因为您与他没有连接。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接