Прочитать все сообщение с помощью 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.