Преглед изворни кода

Coalesce outbound messages in chat example

Gary Burd пре 9 година
родитељ
комит
a68708917c
2 измењених фајлова са 30 додато и 3 уклоњено
  1. 26 2
      examples/chat/conn.go
  2. 4 1
      examples/chat/home.html

+ 26 - 2
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:

+ 4 - 1
examples/chat/home.html

@@ -36,7 +36,10 @@ $(function () {
             appendLog($("<div><b>Connection closed.</b></div>"));
         };
         conn.onmessage = function (evt) {
-            appendLog($("<div/>").text(evt.data));
+            var messages = evt.data.split('\n')
+            for (var i = 0; i < messages.length; i++) {
+                appendLog($("<div/>").text(messages[i]));
+            }
         };
     } else {
         appendLog($("<div><b>Your browser does not support WebSockets.</b></div>"));