在我获得用户输入之前 TCP 连接被关闭

TCP connection is being closed before I can get a user input

我已经设置了一个服务器来等待 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 函数中。我想开始将输入读取到 goroutine 中,因为会有额外的数据处理。但是,当我连接到我的服务器 (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() 移到 goroutine 之外并且这有效,但是这里的代码示例在 goroutine 中有它并且他的示例有效。为什么会这样?

由于您在 handleConn 函数中生成一个 goroutine,它不需要等待 return 的任何内容,因此延迟 conn.Close() 运行 s 并关闭连接。您可能需要 运行 scanner.Scan() 退出 goroutine 以便它阻塞等待输入。