diff --git a/examples/chat/conn.go b/examples/chat/conn.go index 2fe2357..44f3df0 100644 --- a/examples/chat/conn.go +++ b/examples/chat/conn.go @@ -5,10 +5,12 @@ package main import ( - "github.com/gorilla/websocket" + "bytes" "log" "net/http" "time" + + "github.com/gorilla/websocket" ) const ( @@ -25,6 +27,11 @@ const ( maxMessageSize = 512 ) +var ( + newline = []byte{'\n'} + space = []byte{' '} +) + var upgrader = websocket.Upgrader{ ReadBufferSize: 1024, WriteBufferSize: 1024, @@ -56,6 +63,7 @@ func (c *Conn) readPump() { } break } + message = bytes.TrimSpace(bytes.Replace(message, newline, space, -1)) hub.broadcast <- message } } @@ -77,10 +85,26 @@ func (c *Conn) writePump() { select { case message, ok := <-c.send: if !ok { + // The hub closed the channel. c.write(websocket.CloseMessage, []byte{}) return } - if err := c.write(websocket.TextMessage, message); err != nil { + + c.ws.SetWriteDeadline(time.Now().Add(writeWait)) + w, err := c.ws.NextWriter(websocket.TextMessage) + if err != nil { + return + } + w.Write(message) + + // Add queued chat messages to the current websocket message. + n := len(c.send) + for i := 0; i < n; i++ { + w.Write(newline) + w.Write(<-c.send) + } + + if err := w.Close(); err != nil { return } case <-ticker.C: diff --git a/examples/chat/home.html b/examples/chat/home.html index 3e0ddab..c0c4c41 100644 --- a/examples/chat/home.html +++ b/examples/chat/home.html @@ -36,7 +36,10 @@ $(function () { appendLog($("
Connection closed.
")); }; conn.onmessage = function (evt) { - appendLog($("
").text(evt.data)); + var messages = evt.data.split('\n') + for (var i = 0; i < messages.length; i++) { + appendLog($("
").text(messages[i])); + } }; } else { appendLog($("
Your browser does not support WebSockets.
"));