2017-08-29 1 views
-2

Ich schreibe eine Chat-Anwendung mit Websockets in Go.Encoder websockets in Go mit gob

Es wird mehrere Chaträume geben und die Idee besteht darin, alle WebSockets, die mit einem Chatroom verbunden sind, in einer Redis-Liste zu speichern.

Um die WebSockets in Redis zu speichern und abzurufen, muss ich sie codieren/dekodieren und (nach this Frage) Ich dachte, dass ich Gob dafür verwenden kann.

Ich verwende github.com/garyburd/redigo/redis für Redis und github.com/gorilla/websocket als meine Websocket-Bibliothek.

Meine Funktion wie folgt aussieht:

func addWebsocket(room string, ws *websocket.Conn) { 
    conn := pool.Get() 
    defer conn.Close() 

    enc := gob.NewEncoder(ws) 

    _, err := conn.Do("RPUSH", room, enc) 
    if err != nil { 
     panic(err.Error()) 
    } 
} 

Allerdings bin ich diesen Fehler:

cannot use ws (type *websocket.Conn) as type io.Writer in argument to gob.NewEncoder: *websocket.Conn does not implement io.Writer (missing Write method) have websocket.write(int, time.Time, ...[]byte) error want Write([]byte) (int, error)

Was bedeutet dieser Fehler bedeuten? Ist die ganze Idee der Codierung der *websocket.Conn falsche oder Typumwandlung erforderlich?

Antwort

0

As detailed in the documentation, Argument zu gob.NewEncoder ist die io.Writer möchten Sie das codierte Ergebnis geschrieben. Dies gibt einen Encoder zurück, an den Sie das Objekt übergeben, das Sie codieren möchten. Es wird das Objekt codieren und das Ergebnis in den Schreiber schreiben.

Unter der Annahme, dass conn ist Ihre redis Verbindung, wollen Sie so etwas wie:

buff := new(bytes.Buffer) 
err := gob.NewEncoder(buff).Encode(ws) 
if err != nil { 
    // handle error 
} 
_,err := conn.Do("RPUSH", room, buff.Bytes())