使用bufio.NewReader(conn)读取整个消息

时间:2017-05-24 13:28:38

标签: networking encryption go chat public-key-exchange

我正在golang中使用一个简单的聊天服务器和客户端。我在阅读net.Conn的消息时遇到了一些麻烦。到目前为止,这就是我一直在做的事情:

bufio.NewReader(conn).ReadString('\n')

由于用户按Enter键发送消息,我只需要读取'\ n'。但我现在正致力于加密,当在客户端和服务器之间发送公钥时,密钥有时包含'\ n',这使得很难获得整个密钥。我只是想知道如何阅读整个消息而不是停留在特定的角色。谢谢!

1 个答案:

答案 0 :(得分:6)

发送二进制数据的一个简单选项是使用长度前缀。将数据大小编码为32位大端整数,然后读取该数据量。

// create the length prefix
prefix := make([]byte, 4)
binary.BigEndian.PutUint32(prefix, uint32(len(message)))

// write the prefix and the data to the stream (checking errors)
_, err := conn.Write(prefix)
_, err = conn.Write(message)

阅读消息

// read the length prefix
prefix := make([]byte, 4)
_, err = io.ReadFull(conn, prefix)


length := binary.BigEndian.Uint32(prefix)
// verify length if there are restrictions

message = make([]byte, int(length))
_, err = io.ReadFull(conn, message)

另见Golang: TCP client/server data delimiter

您当然也可以使用现有的测试协议,如HTTP,IRC等,以满足您的消息传递需求。 go std库附带一个简单的textproto package,或者您可以选择将消息包含在统一编码中,例如JSON。