【问题标题】:gorilla/websocket send and read bytes datagorilla/websocket 发送和读取字节数据
【发布时间】:2020-04-13 12:23:53
【问题描述】:

我正在尝试通过 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)

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

【问题讨论】:

    标签: go websocket gorilla


    【解决方案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
    

    因为写入byte.Buffer时不需要缓冲数据,所以可以通过去掉bufio.Writer来改进代码:

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

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

    【讨论】:

    • 感谢websocket.BinaryMessage常量;最后一个问题;我无法从message 保存有效文件;确切的代码仍然相同
    • @DEFFPALKON 您是否按照此答案中的说明解决了 bufio.Writer 的问题?
    • 我使用第二个代码;现在我转移json;不再 bin @cerise-limon
    猜你喜欢
    • 2021-01-06
    • 2016-09-18
    • 2020-04-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-25
    • 1970-01-01
    相关资源
    最近更新 更多