Как отправить веб-сокет с сервера в Golang - PullRequest
1 голос
/ 01 февраля 2020

Я пытаюсь создать приложение веб-сокета, используя Go, где пользователь вводит любую строку, а веб-сокет отображает строку обратно клиенту (браузеру).

Но мне нужен другой API (POST), который может отправить сообщение в веб-сокет и отобразить его в браузере. Я пытался извлечь уроки из подобных случаев, таких как Как активно отправлять сообщения с сервера веб-сокетов golang на клиент , но все еще не смог выполнить его.

Пожалуйста, помогите мне.

сервер (основной. 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)
        }
    }
}

клиент (index. html)

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

Ответы [ 2 ]

0 голосов
/ 01 февраля 2020

Я понял, как сделать POST API для отправки сообщения через websocket.

0 голосов
/ 01 февраля 2020

Удалите 'go' перед вашей функцией эха, не нужно запускать его как программу. Когда вы делаете это, немедленно закрывает ваше соединение Websocket. Я только что проверил это и без него работает нормально

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...