我已设置服务器以等待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中具有此功能,并且他的示例也有效。为什么会这样?
答案 0 :(得分:2)
由于您正在handleConn
函数中生成一个goroutine,因此它不需要等待任何返回,因此延迟的conn.Close()
运行并关闭连接。您可能需要在goroutine中运行scanner.Scan()
,以使其阻止等待输入。