Why channels do not accept new messages? Only CPU loads on all. Could anyone explain to me what the error is? Thank you in advance
SERVER
package main import ( "fmt" "net/http" "io/ioutil" "golang.org/x/net/websocket" ) var ( newClientChan chan *websocket.Conn newMessageChan chan []byte ) func indexHandle(w http.ResponseWriter, r *http.Request) { indexFile, _ := ioutil.ReadFile("chat.html") w.Write(indexFile) } func wsHandler(conn *websocket.Conn) { newClientChan <- conn for { byf := make([]byte, 512) _, err := conn.Read(byf) if err != nil { continue } newMessageChan <- byf } } func main() { newClientChan = make(chan *websocket.Conn) newMessageChan = make(chan []byte) go chatServer() http.HandleFunc("/", indexHandle) http.Handle("/ws", websocket.Handler(wsHandler)) http.ListenAndServe(":8080", nil) } func chatServer() { clients := make([]*websocket.Conn, 10) for { select { case client := <- newClientChan: clients = append(clients, client) case message := <- newMessageChan: fmt.Println(string(message)) for _, client := range clients { client.Write(message) } } } } CLIENT (chat.html)
<head> <meta charset="utf-8"> <input type="text" id="input"> <button>send</button> <div id="messages"></div> <script type="text/javascript"> const input = document.querySelector("#input"); const btn = document.querySelector("#btn"); const messages = document.querySelector("#messages"); const ws = new WebSocket("ws://localhost:8080/ws"); ws.onmessage = (event)=> { messages.innerHTML += messages.innerHTML+event.data+"<br>"; } ws.onopen = function(event) { btn.onclick = function() { if(!input.innerHTML) return; ws.send(input.innerHTML); } } </script>
if err != nil { continue }you geterr==io.EOF.if err != nil { continue }when you reach the end of the data, you geterr==io.EOF.what your code starts an endless loop because_, err := conn.Read(byf)will continue to give youerr==io.EOF. - biosckonwsHandler()you should usewebsocket.Message.Receive(ws, &message)for example astaxie.gitbooks.io/build-web-application-with-golang/en/… - biosckon