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()
ゴルーチンの外に移動してみましたが、これは機能しますが、ここのコード例はゴルーチン内にあり、彼の例は機能します。これはなぜですか?
handleConn
funcでゴルーチンをスポーンしているので、何かが返されるのを待つ必要がないため、遅延オブジェクトがconn.Close()
実行され、接続が閉じます。scanner.Scan()
入力待ちをブロックするために、ゴルーチンを使い果たす必要があるかもしれません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加