大猩猩/ websocket发送和读取字节数据

时间:2019-12-21 08:05:37

标签: go websocket gorilla

我正在尝试通过大猩猩/ websocket发送图像数据的字节,我当前的代码是:

var b bytes.Buffer
empty := bufio.NewWriter(&b)
png.Encode(empty, img)

err = c.WriteMessage(websocket.TextMessage, b.Bytes())

我的用于接收消息的代码:

_, message, err := c.ReadMessage()
if err != nil {
    log.Println("read:", err)
    return
}
// log.Printf("recv: %s", message)
ioutil.WriteFile("./nani.png", []byte(message), 0644)

然后保存的文件已损坏,我该如何以二进制/字节的形式写入/读取消息

1 个答案:

答案 0 :(得分:1)

必须刷新bufio.Writer才能将任何缓冲的数据写入基础写入器(在这种情况下为bytes.Buffer)。如果未刷新bufio.Writer,则某些图像数据可能会丢失,并且图像似乎已损坏。

有关刷新记录器的更多信息,请参见bufio.Writer documentation

解决方法是

var b bytes.Buffer
empty := bufio.NewWriter(&b)
png.Encode(empty, img)
empty.Flush()    // <-- add this call

因为写入字节时不需要缓冲数据。因此,可以通过消除bufio.Writer来改进代码:

var b bytes.Buffer
png.Encode(&b, img)

使用websocket.BinaryMessage发送二进制消息。有关消息类型的更多信息,请参见文档的Data Message部分。