Метод http.Server.Close
Метод http.Server.Close немедленно закрывает
все активные соединения сервера. В отличие от метода
http.Server.Shutdown, который ожидает завершения
обработки запросов, Close прерывает соединения
принудительно, не дожидаясь завершения текущих операций.
Метод не принимает параметров и возвращает ошибку, если
закрытие соединений прошло неудачно.
Синтаксис
err := server.Close()
Пример с немедленным закрытием
Давайте создадим HTTP-сервер и немедленно закроем его
с помощью метода Close:
package main
import (
"fmt"
"net/http"
"time"
)
func main() {
server := &http.Server{
Addr: ":8080",
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Request processed")
}),
}
go func() {
time.Sleep(2 * time.Second)
err := server.Close()
if err != nil {
fmt.Println("Close error:", err)
} else {
fmt.Println("Server closed")
}
}()
err := server.ListenAndServe()
if err != nil && err != http.ErrServerClosed {
fmt.Println("Server error:", err)
}
}
Результат выполнения кода:
"Server closed"
Пример с обработкой ошибок
Давайте обработаем ошибку при закрытии сервера, который не был запущен:
package main
import (
"fmt"
"net/http"
)
func main() {
server := &http.Server{
Addr: ":8080",
}
err := server.Close()
if err != nil {
fmt.Println("Error closing server:", err)
} else {
fmt.Println("Server closed successfully")
}
}
Результат выполнения кода:
"Error closing server: close tcp :8080: use of closed network connection"
Пример с использованием в обработчике
Давайте закроем сервер прямо из обработчика запроса:
package main
import (
"fmt"
"net/http"
)
func main() {
server := &http.Server{
Addr: ":8080",
Handler: http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "Closing server...")
go func() {
err := server.Close()
if err != nil {
fmt.Println("Close error:", err)
}
}()
}),
}
err := server.ListenAndServe()
if err != nil && err != http.ErrServerClosed {
fmt.Println("Server error:", err)
}
}
Результат выполнения кода:
"Closing server..."
Смотрите также
-
метод
http.Server.Shutdown,
который плавно завершает работу сервера -
метод
http.Server.ListenAndServe,
который запускает сервер и слушает входящие запросы -
константу
http.ErrServerClosed,
которая используется для проверки планового закрытия -
метод
http.Server.Serve,
который принимает входящие соединения на переданном слушателе