Skip to content

Instantly share code, notes, and snippets.

@codeskyblue
Last active July 5, 2017 11:36
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 codeskyblue/368657a4ec6bbe43675a14c0b69884c2 to your computer and use it in GitHub Desktop.
Save codeskyblue/368657a4ec6bbe43675a14c0b69884c2 to your computer and use it in GitHub Desktop.
Convert https://github.com/phoboslab/jsmpeg websocket-relay.js to Go language
package main
import (
"log"
"net/http"
"sync"
"github.com/gorilla/websocket"
)
var upgrader = websocket.Upgrader{
CheckOrigin: func(r *http.Request) bool { return true },
Subprotocols: []string{"null"},
}
func init() {
lock := sync.RWMutex{}
wsClients := make(map[*websocket.Conn]bool)
http.HandleFunc("/ws/relay", func(w http.ResponseWriter, r *http.Request) {
c, err := upgrader.Upgrade(w, r, nil)
if err != nil {
log.Println(err)
return
}
log.Printf("New Websocket Connection: %v (%d) total", r.RemoteAddr, len(wsClients)+1)
defer c.Close()
wsClients[c] = true
defer func() {
lock.Lock()
defer lock.Unlock()
delete(wsClients, c)
}()
for {
_, _, err := c.ReadMessage()
if err != nil {
break
}
}
})
http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) {
log.Printf("Stream connected: %v", r.RemoteAddr)
buf := make([]byte, 4096)
defer r.Body.Close()
for {
n, err := r.Body.Read(buf)
if err != nil {
break
}
log.Println("Reveive length:", len(buf[:n]))
lock.RLock()
for c, ok := range wsClients {
if !ok {
continue
}
if err := c.WriteMessage(websocket.BinaryMessage, buf[:n]); err != nil {
wsClients[c] = false
}
}
lock.RUnlock()
}
})
}
func main() {
log.Fatal(http.ListenAndServe(":8100", nil))
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment