package main import ( "io" "log" "net" "github.com/gorilla/websocket" ) func wsReader(wsconn *websocket.Conn, out chan []byte) { for { messageType, p, err := wsconn.ReadMessage() if err != nil { log.Printf("error: wsReader: %s", err) return } if messageType != websocket.BinaryMessage { log.Println("error: wsReader: only binary messages are supported") continue } out <- p } } func socketReader(proxyconn net.Conn, out chan []byte) { for { readBuffer := make([]byte, 2048) i, err := proxyconn.Read(readBuffer) if err != nil { if err == io.EOF { log.Println("info: socketReader: Disconnected") } else { log.Printf("error: socketReader: %s", err) } return } out <- readBuffer[:i] } } func serviceBoth(wsconn *websocket.Conn, proxyconn net.Conn) { sc := make(chan []byte) wsc := make(chan []byte) go socketReader(proxyconn, sc) go wsReader(wsconn, wsc) for { select { case sd := <-sc: if err := wsconn.WriteMessage(websocket.BinaryMessage, sd); err != nil { log.Printf("error: serviceBoth: %s", err) return } case wsd := <-wsc: if _, err := proxyconn.Write(wsd); err != nil { log.Printf("error: serviceBoth: %s", err) return } } } }