猿问

如何从 Golang 中的服务器发送 websocket

我正在尝试使用 Go 构建一个 websocket 应用程序,其中用户输入任何字符串,websocket 将字符串显示回客户端(浏览器)。


但我需要另一个可以向 websocket 发送消息并在浏览器中显示的 api (POST)。我试图从类似的案例中学习,例如如何将消息从 golang 的 websocket 服务器主动发送到客户端,但仍然无法将其关闭。


请帮我。


服务器(main.go)


package main


import (

    "fmt"

    "io/ioutil"

    "net/http"


    "github.com/gorilla/websocket"

)


type msg struct {

    Input string

}


func main() {

    http.HandleFunc("/ws", wsHandler)

    http.HandleFunc("/", rootHandler)


    panic(http.ListenAndServe(":8080", nil))

}


func rootHandler(w http.ResponseWriter, r *http.Request) {

    content, err := ioutil.ReadFile("index.html")

    if err != nil {

        fmt.Println("Could not open file.", err)

    }

    fmt.Fprintf(w, "%s", content)

}


func wsHandler(w http.ResponseWriter, r *http.Request) {

    if r.Header.Get("Origin") != "http://"+r.Host {

        http.Error(w, "Origin not allowed", 403)

        return

    }

    conn, err := websocket.Upgrade(w, r, w.Header(), 1024, 1024)

    if err != nil {

        http.Error(w, "Could not open websocket connection", http.StatusBadRequest)

    }


    go echo(conn)

}


func echo(conn *websocket.Conn) {

    for {

        m := msg{}


        err := conn.ReadJSON(&m)

        if err != nil {

            fmt.Println("Error reading json.", err)

        }


        fmt.Printf("Got message: %#v\n", m)


        if err = conn.WriteJSON(m); err != nil {

            fmt.Println(err)

        }

    }

}


慕哥9229398
浏览 228回答 1
1回答

肥皂起泡泡

删除 echo 函数前面的“go”,无需将其作为 goroutine 运行。当你这样做时,它会立即关闭你的 Websocket 连接。我刚刚对此进行了测试,没有它它可以正常工作
随时随地看视频慕课网APP

相关分类

Go
我要回答