在我获得用户输入之前 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 以便它阻塞等待输入。
我已经设置了一个服务器来等待 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 以便它阻塞等待输入。