2016-04-25 2 views
0

Ich bin derzeit versucht, mit WebSockets und meinem Code zu kommunizieren, ist der folgende (im mit Gorilla)Go WebSockets Daten gopherjs

buff := bytes.NewBuffer([]byte{}) 
binary.Write(buff, binary.LittleEndian, uint64(1)) 
binary.Write(buff, binary.LittleEndian, len(message)) 
binary.Write(buff, binary.LittleEndian, message) 
client.Write <- buff.Bytes() 

Der c.Write Kanal seiner Innenseite eines für ausgewählte Schleife

case msg := <-client.Write: 
    buffer := &bytes.Buffer{} 
    err := binary.Write(buffer, binary.LittleEndian, msg) 
    if err != nil { 
     return 
    } 
    err = client.Ws.WriteMessage(websocket.BinaryMessage, buffer.Bytes()) 
    if err != nil { 
     return 
    } 
    buffer.Reset() 

und Client ist nur eine Struktur

type Client struct { 
    Ws  *websocket.Conn 
    Read chan []byte 
    Write chan []byte 
    Account *models.Account 
} 

Die Nachricht erfolgreich gesendet wird, und ich lese es wie diese

b, err := conn.Read(buff) 
if err != nil { 
    utils.Log("Error while reading from socket " + err.Error()) 
    return 
} 
buffer := bytes.NewBuffer(buff[:b]) 
t, err := binary.ReadUvarint(buffer) 
utils.Log(t) 
if err != nil { 
    utils.Log("Error while reading from socket " + err.Error()) 
    return 
} 
switch t { 
case 1: 
    roomsLen, err := binary.ReadUvarint(buffer) 
    if err != nil { 
     utils.Log("Error while reading rooms len " + err.Error()) 
     return 
    } 
    utils.Log(roomsLen) 
    roomsBytes := make([]byte, roomsLen) 
    binary.Read(buffer, binary.LittleEndian, roomsBytes) 
    rooms := []*Room{} 
    err = json.Unmarshal(roomsBytes, rooms) 
    if err != nil { 
     utils.Log("Error while unmarshaling room list " + err.Error()) 
     return 
    } 
    utils.Log(rooms) 

Die utils.Log Funktion ist nur diese

func Log(msg interface{}) { 
    n := time.Now() 
    console.Call("log", fmt.Sprintf("[%v:%v:%v] %v", n.Hour(), n.Minute(), n.Second(), msg)) 
} 

Thing ist die erste uint64 das Warten ein im (1), aber der zweite uint64 im Lesen ist immer 0, während loggin es (len (message)) gibt mir 52

und da seine immer 0 ich kann nicht Abstellungs es richtig

Also ich bin nicht sicher, was ich falsch mache oder, wenn dies nicht die richtige Art und Weise WebSockets zu verwenden.

Antwort

1

Kleiner Fehler. Sie schreiben uint64, verwenden aber "ReadUvarint", um es zu lesen (eine Variable ist eine andere Art von Daten).

package main 

import (
    "bytes" 
    "encoding/binary" 
    "fmt" 
) 

func main() { 
    b := bytes.NewBuffer([]byte{}) 
    e1 := binary.Write(b, binary.LittleEndian, uint64(10)) 
    e2 := binary.Write(b, binary.LittleEndian, uint64(20)) 

    fmt.Println("writing 10 and 20", e1, e2) 

    { 
     r := bytes.NewBuffer(b.Bytes()) 
     res, e := binary.ReadUvarint(r) 
     res2, e2 := binary.ReadUvarint(r) 
     fmt.Println("using readuvarint here  :", res, res2, e, e2, b.Bytes()) 
    } 
    { 
     r := bytes.NewBuffer(b.Bytes()) 
     var res, res2 uint64 
     e := binary.Read(r, binary.LittleEndian, &res) 
     e2 := binary.Read(r, binary.LittleEndian, &res2) 
     fmt.Println("using read into uint64's here :", res, res2, e, e2, b.Bytes()) 
    } 
}