Skip to content

Instantly share code, notes, and snippets.

@codysoyland
Last active August 29, 2015 13:56
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save codysoyland/9127011 to your computer and use it in GitHub Desktop.
Save codysoyland/9127011 to your computer and use it in GitHub Desktop.
package main
import (
"log"
"net/http"
"github.com/gorilla/websocket"
)
func main() {
conns := make([]*websocket.Conn, 0)
conn_chan := make(chan *websocket.Conn)
color_chan := make(chan string)
go func() {
for {
select {
case conn := <-conn_chan:
conns = append(conns, conn)
case color := <-color_chan:
data := map[string]string{"color": color}
for _, conn := range conns {
conn.WriteJSON(data)
}
}
}
}()
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte(`
<html><head><title>Websocket test</title></head><body>
<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<input id="color" type="text"/>
<button id="submit">submit</button>
<script type="text/javascript">
var ws = new WebSocket("ws://" + window.location.host + "/ws")
ws.onmessage = function(mes) {
var color = JSON.parse(mes.data)['color']
document.body.style.background = color
}
$('#submit').click(function() {
var value = JSON.stringify({'color': $('#color').val()})
ws.send(value)
})
</script>
</body></html>
`))
})
http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) {
ws, err := websocket.Upgrade(w, r, nil, 1024, 1024)
if _, ok := err.(websocket.HandshakeError); ok {
http.Error(w, "Not a websocket handshake", 400)
return
} else if err != nil {
log.Println(err)
http.Error(w, err.Error(), 500)
return
}
conn_chan <- ws
for {
data := make(map[string]string)
err := ws.ReadJSON(&data)
if err != nil {
log.Println(err)
return
}
color_chan <- data["color"]
}
})
http.ListenAndServe(":9000", nil)
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment