Skip to content

Instantly share code, notes, and snippets.

@tmichel
Created November 9, 2013 22:07
Show Gist options
  • Star 57 You must be signed in to star a gist
  • Fork 15 You must be signed in to fork a gist
  • Save tmichel/7390690 to your computer and use it in GitHub Desktop.
Save tmichel/7390690 to your computer and use it in GitHub Desktop.
simple websocket example with golang
<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({ Num: parseInt($("#numberfield").val()) }));
});
});
</script>
</body>
</html>
package main
import (
"fmt"
"github.com/gorilla/websocket"
"io/ioutil"
"net/http"
)
type msg struct {
Num int
}
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)
}
}
}
@titpetric
Copy link

Index.html, line 29, use: "ws://" + location.host + "/ws"

@rbucker
Copy link

rbucker commented Aug 20, 2017

@bruceadowns
Copy link

you need a return if websocket.Upgrade returns an error. (insert at line 37)

@bburch01
Copy link

Not sure why peeps are trying to correct your code. This worked perfectly for me right out of the box. It took me forever to find a good example of using websockets in a golang based web app. Thank you!!!!

@Menzer05
Copy link

hi , please how to send 2 or many json files ???

@ba11b0y
Copy link

ba11b0y commented Apr 20, 2020

Thanks a ton! @tmichel

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment