Skip to content

Instantly share code, notes, and snippets.

@mmitou
Created May 19, 2021 04:41
Show Gist options
  • Save mmitou/844e541e4ec28e9487235b3b9ddc89f8 to your computer and use it in GitHub Desktop.
Save mmitou/844e541e4ec28e9487235b3b9ddc89f8 to your computer and use it in GitHub Desktop.
websocket example on go, echo
<!DOCTYPE html>
<html>
<head>
<title>signaling</title>
</head>
<body>
<div class="websocketControl">
<button class="websocketControl_openCloseButton">open</button>
</div>
<div class="input">
<input type="text">
<button class="input_sendButton">send</button>
</div>
<div class="output">
</div>
<script src="main.js"></script>
</body>
</html>
package main
import (
"net/http"
"time"
"github.com/gorilla/websocket"
"github.com/labstack/echo/v4"
"github.com/rs/zerolog"
"github.com/rs/zerolog/log"
)
var upgrader = websocket.Upgrader{}
func signalingServer(c echo.Context) error {
w := c.Response()
r := c.Request()
conn, err := upgrader.Upgrade(w, r, nil)
if err != nil {
return err
}
defer conn.Close()
log.Debug().Msg("websocket start!")
for {
mt, p, err := conn.ReadMessage()
if err != nil {
return err
}
rcvmsg := string(p)
log.Debug().Str("p", rcvmsg).Msg("received")
err = conn.WriteMessage(mt, ([]byte)(rcvmsg + rcvmsg))
if err != nil {
return err
}
}
}
func main() {
e := echo.New()
zerolog.TimeFieldFormat = time.RFC3339Nano
zerolog.SetGlobalLevel(zerolog.DebugLevel)
e.GET("/hello", func(c echo.Context) error {
return c.HTML(http.StatusOK, "<h1>hello</h1>")
})
e.GET("/ws", signalingServer)
e.Static("/", "./web")
e.Logger.Fatal(e.Start(":8080"))
}
"use strict";
let ws = null;
const print = ((output) => {
return (msg) => {
const d = document.createElement("div");
d.textContent = msg;
output.appendChild(d);
output.scroll(0, output.scrollHeight);
};
})(document.querySelector("div.output"));
const initWebsocket = (websocket) => {
websocket.addEventListener("open", () => print("open"));
websocket.addEventListener("close", () => {
print("close");
ws = null;
});
websocket.addEventListener("message", (event) => {
print("response: " + event.data);
});
websocket.addEventListener("error", (event) => {
console.log("error:", event.data);
});
return websocket;
};
document
.querySelector(".websocketControl_openCloseButton")
.addEventListener("click", (event) => {
console.log("openClose button clicked", ws == null);
if (ws == null) {
// open websocket
ws = new WebSocket("ws://localhost:8080/ws");
initWebsocket(ws);
// change button text for close
event.target.innerText = "close";
} else {
ws.close();
// change button text for open
event.target.innerText = "open";
}
});
document
.querySelector(".input_sendButton")
.addEventListener("click", (event) => {
if (ws == null) {
print("ws is null");
return;
}
const input = document.querySelector("input");
print("send: " + input.value);
ws.send(input.value);
return;
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment