@loparenok

Почему не получается обменяться данными через net.Conn?

Клиент и сервер обмениваются некой информацией, после получения от от сервера запроса, клиент отправляет серверу файл через net.Conn. И после отправки файла при попытке прочитать следующее сообщение сервером от клиента получаю первую строку переданного ранее файла.
Код чтения сообщений на сервере:
func get_message_from_client(c net.Conn) string {
	message, _ := bufio.NewReader(c).ReadString('\n')
	message = strings.TrimSpace(message)
	write_log("Получено сообщение от клиента: ", message)
	return message
}

Код получения файла на сервере:
func save_file(file_size int64, file_path string, c net.Conn) {
	write_log("получаем файл от клиента: ", file_path)
	newfile, err := os.Create(file_path)
	if err != nil {
		write_log("не удалось создать файл: ", file_path)
		fmt.Println(err)
	}
	defer newfile.Close()

	var BUFFERSIZE int64
	var receivedBytes int64

	BUFFERSIZE = 1024

	for {
		if (file_size - receivedBytes) < BUFFERSIZE {
			io.CopyN(newfile, c, (file_size - receivedBytes))
			c.Read(make([]byte, (receivedBytes+BUFFERSIZE)-file_size))
			break
		}
		io.CopyN(newfile, c, BUFFERSIZE)
		receivedBytes += BUFFERSIZE
	}
}

Функции вызываются последовательно,
for {
   message := get_message_from_client(c)
   if message == "FILE" {
      save_file(file_save.size, new_name_file, c)
      send_message(c, "PASS")
   }
}
  • Вопрос задан
  • 56 просмотров
Решения вопроса 1
По-первых, когда вы создаете буферный ридер и читаете строку bufio.NewReader(c).ReadString('\n'), то ридер на самом деле может прочитать гораздо больше, чем одна строка, на то он и буферный.
Если хотите использовать bufio, то создавайте ридер один раз и дальше передавайте его везде по коду и читайте только из него, а не из net.Conn

Во-вторых, как-то вы очень сложно написали получение файла, ошибка скорее всего именно там.
Это все лучше делать средствами стандартной библиотеки:
limited := io.LimitReader(c, file_size)
err = io.Copy(newfile, limited)
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы