Go では、Listen.Accept 関数は、接続が受け入れられるまで実行をブロックします。このため、エラーと閉じられた接続の違いが分からないため、リスニング サーバーを正常に停止することが困難になります。
解決策の 1 つは、done チャネルを使用して、サーバーがリスニングを停止するタイミングを通知することです。これにより、エラーを発生させずに待機中のソケットを閉じることができます。
これを行う方法の例を次に示します。
// Echo server struct type EchoServer struct { listen net.Listener done chan bool } // Listen for incoming connections func (es *EchoServer) serve() { for { conn, err := es.listen.Accept() if err != nil { select { case <-es.done: // If we called stop() then there will be a value in es.done, so // we'll get here and we can exit without showing the error. default: log.Printf("Accept failed: %v", err) } return } go es.respond(conn.(*net.TCPConn)) } } // Stop the server by closing the listening listen func (es *EchoServer) stop() { es.done <- true // We can advance past this because we gave it buffer of 1 es.listen.Close() // Now it the Accept will have an error above }
このコードは、done チャネルを使用して、サーバーがいつ終了すべきかを通知します。聞くのをやめてください。 stop メソッドが呼び出されると、done チャネルに値が送信され、serve メソッドが終了します。
これにより、エラーを発生させることなく、リスニング サーバーを正常に停止できます。
以上がGo リスニング サーバーをエラーなしで正常に停止するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。