TCP-соединение закрывается до того, как я смогу получить ввод пользователя

Я настроил сервер для ожидания TCP-соединения и чтения ввода от пользователя:

func main() {
  err := godotenv.Load()
  if err != nil {
    log.Fatal(err)
  }

  server, err := net.Listen("tcp", ":"+os.Getenv("PORT"))

  if err != nil {
    log.Fatal(err)
  }

  log.Println("HTTP Server Listening on port :", os.Getenv("PORT"))
  defer server.Close()

  for {
    conn, err := server.Accept()
    if err != nil {
      log.Fatal(err)
    }
    go handleConn(conn)
  }
}

Проблема, с которой я столкнулся, связана с моей функцией handleConn. Я хочу начать чтение ввода в горутину, потому что будет дополнительная обработка данных. Однако, когда я подключаюсь к своему серверу (nc localhost 9000), мое соединение немедленно прерывается.

func handleConn(conn net.Conn) {
  defer conn.Close()
  io.WriteString(conn, "Enter a transaction:")

  scanner := bufio.NewScanner(conn)

  go func() {
    for scanner.Scan() {
      log.Println("User entered: ")
      log.Println(scanner.Text())
    }

  }()
}

Я вижу сообщение Enter a transaction:, но я не могу ничего ввести, потому что мое соединение немедленно прерывается, и меня отбрасывают обратно в терминал bash. Что я здесь делаю не так?

Обновлено: я следую этому руководству - https://github.com/mycoralhealth/blockchain-tutorial/blob/master/networking/main.go.

Я попытался переместить scanner.Scan() за пределы горутины, и это работает, но в приведенном здесь примере кода он находится внутри горутины, и его пример работает. Почему это так?

Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
Создание API ввода вопросов на разных языках программирования (Python, PHP, Go и Node.js)
API ввода вопросов - это полезный инструмент для интеграции моделей машинного обучения, таких как ChatGPT, в приложения, требующие обработки...
0
0
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку вы создаете горутину в своей функции handleConn, ей не нужно ждать, пока что-нибудь вернется, поэтому отложенный conn.Close() запускается и закрывает соединение. Возможно, вам потребуется запустить scanner.Scan() из горутины, чтобы он блокировал ожидание ввода.

Я следовал этому руководству - github.com/mycoralhealth/blockchain-tutorial/blob/master/…. Он также помещает scanner.Scan () в горутину, я протестировал его код, и он работает. Вы знаете, почему это так?

Huy 26.10.2018 02:52

Вероятно, потому что github.com/mycoralhealth/blockchain-tutorial/blob/… блокируется при ожидании получения от этого канала, который горутина отправляет после получения пользовательского ввода.

Carlos Gomez 26.10.2018 02:57

Отлично, спасибо за объяснение, Карлос! Не понимали, что переменная, которую они использовали, на самом деле была каналом.

Huy 26.10.2018 03:34

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