TCP-соединение закрывается, прежде чем я могу получить пользовательский ввод - PullRequest
0 голосов
/ 26 октября 2018

Я настроил сервер для ожидания соединения 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() за пределы программы, и это работает, но пример кода здесь имеетэто внутри горутина и его пример работает.Почему это так?

1 Ответ

0 голосов
/ 26 октября 2018

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

...