Прочитать все сообщение с помощью bufio.NewReader(conn)

Я работаю над простым сервером чата и клиентом в Голанге. У меня возникли проблемы с чтением сообщений из сети. Пока это то, что я делал:

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

Так как пользователь нажимает клавишу ввода, чтобы отправить сообщение, мне нужно только прочитать до '\n'. Но сейчас я работаю над шифрованием, и при отправке открытых ключей между клиентом и сервером ключ иногда содержит '\n', что затрудняет получение всего ключа. Мне просто интересно, как я могу прочитать все сообщение вместо того, чтобы остановиться на конкретном символе. Спасибо!

1 ответ

Простой способ отправки двоичных данных - использовать префикс длины. Кодируйте размер данных как 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 / клиент / сервер.

Конечно, вы также можете использовать существующий протокол тестирования скважины, такой как HTTP, IRC и т. Д., Для ваших нужд обмена сообщениями. Библиотека go std поставляется с простым textproto пакет, или вы можете заключить сообщения в единую кодировку, например, JSON.

Другие вопросы по тегам