如何主动发送来自golang的消息';s websocket服务器到客户端

如何主动发送来自golang的消息';s websocket服务器到客户端,go,websocket,Go,Websocket,我是golang和websocket的新手 我正在尝试编写一个websocket服务器,它可以在握手完成后主动向客户端发送消息 但我的服务器只会在收到客户机的请求时才将消息发送给客户机 是否有人知道如何实现此功能,或者我在哪里可以找到相关的答案 非常感谢你 源代码如下: package main import ( "log" "net/http" ) func handler(w http.ResponseWriter, req *http.Request) { w.

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

首先,您的服务器是在http而不是websocket上的(为此,您可以使用gorilla将其升级到websocket,例如)

第二,在客户发出请求之前,您无法响应他,因为您与他没有任何联系(daaa)

请尝试软件包

下面是一个简单的抓取示例:


谢谢你们回答我的问题。 很抱歉,这里的回复很晚

你们的回答真的很有帮助,我学到了很多

最后,我还找到了不使用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)
    }
}

这是一个普通的HTTP处理程序。没有实现websocket协议的代码。考虑使用。
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)
    }
}