首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Golang服务器上发送websocket

如何在Golang服务器上发送websocket
EN

Stack Overflow用户
提问于 2020-02-01 15:44:36
回答 1查看 2.7K关注 0票数 2

我试图使用Go构建websocket应用程序,用户输入任何字符串,websocket将字符串显示给客户端(浏览器)。

但我需要另一个api (POST),它可以向websocket发送消息并在浏览器中显示它。我试着从类似的案例(如How to send the messages actively from golang's websocket server to client )中学习,但仍然无法成功。

请帮帮我。

服务器(main.go)

代码语言:javascript
复制
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)
        }
    }
}

client (index.html)

代码语言:javascript
复制
<html>
<head>
    <title>WebSocket demo</title>
</head>
<body>

    <div>
        <form>
            <label for="numberfield">Number</label>
            <input type="text" id="numberfield" placeholder="12"/><br />
            <button type="button" id="sendBtn">Send</button>
        </form>
    </div>
    <div id="container"></div>

    <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
    <script type="text/javascript">
        $(function () {
            var ws;

            if (window.WebSocket === undefined) {
                $("#container").append("Your browser does not support WebSockets");
                return;
            } else {
                ws = initWS();
            }

            function initWS() {
                var socket = new WebSocket("ws://localhost:8080/ws"),
                    container = $("#container")
                socket.onopen = function() {
                    container.append("<p>Socket is open</p>");
                };
                socket.onmessage = function (e) {
                    container.append("<p> Got some shit:" + e.data + "</p>");
                }
                socket.onclose = function () {
                    container.append("<p>Socket closed</p>");
                }

                return socket;
            }

            $("#sendBtn").click(function (e) {
                e.preventDefault();
                ws.send(JSON.stringify({ Input: $("#numberfield").val() }));
            });
        });
    </script>
</body>
</html>
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-02-01 17:34:50

删除回波函数前面的“go”,不需要将其作为一个goroutine运行。当您这样做时,立即关闭您的Websocket连接。我刚刚测试了这个,没有它它就正常工作了

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60018471

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档