Go 在获取用户输入之前,TCP连接已关闭
我已设置服务器以等待TCP连接并从用户处读取输入:Go 在获取用户输入之前,TCP连接已关闭,go,goroutine,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 po
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中,因为会有额外的数据处理。但是,当我连接到我的服务器(nclocalhost 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())
}
}()
}
我看到消息输入事务:
,但我无法输入任何内容,因为我的连接立即终止,我被踢回bash终端。我做错了什么
编辑:我正在学习本教程-
我已经尝试将
scanner.Scan()
移动到goroutine之外,这是可行的,但是这里的代码示例在goroutine内部,他的示例也有效。为什么会出现这种情况?由于您正在handleConn
函数中生成一个goroutine,它不需要等待任何返回,因此延迟的conn.Close()
将运行并关闭连接。您可能需要在goroutine外运行scanner.Scan()
,以阻止等待输入。由于您正在handleConn
函数中生成goroutine,它不需要等待任何返回,因此延迟的conn.Close()
将运行并关闭连接。您可能需要在goroutine之外运行scanner.Scan()
,以阻止等待输入。我正在学习本教程-。他还将scanner.Scan()放在goroutine中,我测试了他的代码,结果它正常工作。你知道为什么会出现这种情况吗?可能是因为goroutine在收到用户输入后会阻止等待从该频道接收。太好了,谢谢你的解释!我没有意识到他们使用的变量实际上是一个通道。我遵循了本教程-。他还将scanner.Scan()放在goroutine中,我测试了他的代码,结果它正常工作。你知道为什么会出现这种情况吗?可能是因为goroutine在收到用户输入后会阻止等待从该频道接收。太好了,谢谢你的解释!没有意识到他们使用的变量实际上是一个通道。