Skip to content

Instantly share code, notes, and snippets.

@jmilet
Last active May 2, 2024 21:36
Show Gist options
  • Save jmilet/4f61d5a342370dcff9234392fc575086 to your computer and use it in GitHub Desktop.
Save jmilet/4f61d5a342370dcff9234392fc575086 to your computer and use it in GitHub Desktop.
Example of WebSocket binary data in Go

The server

package main

import (
	"bytes"
	"encoding/binary"
	"flag"
	"fmt"
	"log"
	"time"

	"net/http"

	"github.com/gorilla/websocket"
)

var addr = flag.String("addr", "localhost:8080", "http service address")

var upgrader = websocket.Upgrader{} // use default options

func pulse(w http.ResponseWriter, r *http.Request) {
	c, err := upgrader.Upgrade(w, r, nil)
	if err != nil {
		log.Print("upgrade:", err)
		return
	}
	defer c.Close()

	for {
		data := bytes.Buffer{}
		err = binary.Write(&data, binary.LittleEndian, time.Now().Unix())
		if err != nil {
			fmt.Println("binary.Write failed:", err)
		}

		err = c.WriteMessage(websocket.BinaryMessage, data.Bytes())
		if err != nil {
			log.Println("write:", err)
			break
		}

		time.Sleep(1000 * time.Millisecond)
	}
}

func main() {
	flag.Parse()
	log.SetFlags(0)
	http.HandleFunc("/log", pulse)
	log.Fatal(http.ListenAndServe(*addr, nil))
}

The client

package main

import (
	"bytes"
	"encoding/binary"
	"flag"
	"log"
	"net/url"

	"github.com/gorilla/websocket"
)

var addr = flag.String("addr", "localhost:8080", "http service address")

func main() {
	flag.Parse()
	log.SetFlags(0)

	u := url.URL{Scheme: "ws", Host: *addr, Path: "/log"}
	log.Printf("connecting to %s", u.String())

	c, _, err := websocket.DefaultDialer.Dial(u.String(), nil)
	if err != nil {
		log.Fatal("dial:", err)
	}
	defer c.Close()

	for {
		_, message, err := c.ReadMessage()
		if err != nil {
			log.Println("read:", err)
			return
		}

		var t int64
		data := bytes.NewReader(message)
		err = binary.Read(data, binary.LittleEndian, &t)
		if err != nil {
			log.Println("read:", err)
			return
		}

		log.Printf("recv: %v", t)
	}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment