Skip to content

Instantly share code, notes, and snippets.

@nasitra
Created May 9, 2016 13:30
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save nasitra/2ec43c1cb3167fba89aa1d93e558e245 to your computer and use it in GitHub Desktop.
Save nasitra/2ec43c1cb3167fba89aa1d93e558e245 to your computer and use it in GitHub Desktop.
Broadcast server implemented with Go and WebSockets
package main
import "github.com/gorilla/websocket"
type client struct {
socket *websocket.Conn
room *room
send chan []byte
}
func (c *client) read() {
for {
_, msg, err := c.socket.ReadMessage()
if err != nil {
break
}
c.room.forward <- msg
}
}
func (c *client) write() {
for msg := range c.send {
if err := c.socket.WriteMessage(websocket.TextMessage, msg); err != nil {
break
}
}
c.socket.Close()
}
package main
import "net/http"
func main() {
r := newRoom()
http.Handle("/room", r)
go r.run()
http.Handle("/", http.FileServer(http.Dir("./")))
http.ListenAndServe(":8080", nil)
}
package main
import (
"log"
"net/http"
"github.com/gorilla/websocket"
)
type room struct {
clients map[*client]struct{}
join chan *client
leave chan *client
forward chan []byte
}
func newRoom() *room {
return &room{
clients: make(map[*client]struct{}),
join: make(chan *client),
leave: make(chan *client),
forward: make(chan []byte),
}
}
func (r *room) run() {
for {
select {
case c := <-r.join:
r.clients[c] = struct{}{}
case c := <-r.leave:
delete(r.clients, c)
close(c.send)
case msg := <-r.forward:
for c := range r.clients {
select {
case c.send <- msg:
default:
delete(r.clients, c)
close(c.send)
}
}
}
}
}
var upgrader = &websocket.Upgrader{
ReadBufferSize: 1024,
WriteBufferSize: 1024,
}
func (r *room) ServeHTTP(w http.ResponseWriter, req *http.Request) {
s, err := upgrader.Upgrade(w, req, nil)
if err != nil {
log.Fatal(err)
return
}
c := &client{
socket: s,
room: r,
send: make(chan []byte, 256),
}
r.join <- c
defer func() { r.leave <- c }()
go c.write()
c.read()
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment