首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Go websockets数据gopherjs

Go websockets数据gopherjs
EN

Stack Overflow用户
提问于 2016-04-25 22:10:07
回答 1查看 190关注 0票数 0

我目前正在尝试使用websockets进行通信,我的代码如下(im使用大猩猩)

代码语言:javascript
复制
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()

c.Write通道在for select循环中

代码语言:javascript
复制
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()

客户端只是一个结构

代码语言:javascript
复制
type Client struct {
    Ws      *websocket.Conn
    Read    chan []byte
    Write   chan []byte
    Account *models.Account
}

这条消息发送成功,我这样读它

代码语言:javascript
复制
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)

utils.Log函数就是这样

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

事情是第一个uint64是一个im等待(1),但是第二个uint64 im阅读总是0,而loggin它(len(message))给我52个

因为它总是0,所以我不能正确地解除它。

所以我不知道我做错了什么,或者这是不是一个正确的方式使用websockets。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-04-26 02:06:43

小错误。您正在编写uint64,但使用"ReadUvarint“读取它( varint是一种不同类型的数据)。

代码语言:javascript
复制
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())
    }
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36852000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档