在获得用户输入之前,TCP连接已关闭

时间:2018-10-26 00:28:12

标签: go goroutine

我已设置服务器以等待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中具有此功能,并且他的示例也有效。为什么会这样?

1 个答案:

答案 0 :(得分:2)

由于您正在handleConn函数中生成一个goroutine,因此它不需要等待任何返回,因此延迟的conn.Close()运行并关闭连接。您可能需要在goroutine中运行scanner.Scan(),以使其阻止等待输入。