在net.Conn上阅读和写作

时间:2013-11-23 17:50:53

标签: sockets encoding io go

我正在尝试从net.Conn读取和写入数据,但由于我只有Read([] byte)和Write([] byte)函数,我发现很难找到辅助函数来完成这项工作。

我需要阅读和编写以下类型:

  • UINT64
  • 字节
  • UINT32
  • UTF-8编码的字符串(首先是uint32长度,后面是字符串数据)

简而言之

Go的软件包中是否有类似Java的DataInputStream和DataOutputStream?

谢谢和问候

3 个答案:

答案 0 :(得分:4)

您需要决定要编组的格式。您的选择是滚动您自己的格式或使用已经制作的格式。我强烈推荐后者。

我之前发布了go标准库中支持的许多格式:https://stackoverflow.com/a/13575325/727643

如果您决定自己滚动,则可以使用encoding/binary从[]字节对uints进行编码和解码。它为您提供了小端和大端的选项。可以使用[]byte(str)将字符串直接转换为[]字节。最后,字节可以作为字节发送。不需要魔法。

我要强调的是,制作自己的格式通常是一个坏主意。我倾向于默认使用JSON,只有当我能获得显着的性能提升时才使用其他JSON,我相信值得花时间去做。

答案 1 :(得分:1)

二进制编码的一个小秘诀是你可以编写和读取整个数据结构:

来自Playground

    buf := new(bytes.Buffer)
    err := binary.Write(buf, binary.LittleEndian, &MyMessage{
    First:   100,
    Second:  0,
    Third:   100,
    Message: MyString{0, [10]byte{'H', 'e', 'l', 'l', 'o', '\n'}},
    })

if err != nil {
    fmt.Printf("binary.Read failed:", err)
    return
}

// <<--- CONN -->>
msg := new(MyMessage)

err2 := binary.Read(buf, binary.LittleEndian, msg)
if err2 != nil {
    fmt.Printf("binary.Read failed:", err2)
    return
}

注意您可以使用的那种类型:

来自binary/encoding docs:

  

固定大小的值是固定大小的算术类型(int8,uint8,int16,float32,complex64,...)或仅包含固定大小值的数组或结构。

请注意,您必须使用[10] byte,并且无法使用[]byte

答案 2 :(得分:0)

Fabrizio的答案很好,我想补充一点,你应该用bufio包中的缓冲读卡器和缓冲写入器包装你的套接字:

http://golang.org/pkg/bufio/

相关问题