Метод http.Server.Close

Метод http.Server.Close немедленно закрывает все активные соединения сервера. В отличие от метода http.Server.Shutdown, который ожидает завершения обработки запросов, Close прерывает соединения принудительно, не дожидаясь завершения текущих операций. Метод не принимает параметров и возвращает ошибку, если закрытие соединений прошло неудачно.

Синтаксис

goerr := server.Close()

Пример с немедленным закрытием

Давайте создадим HTTP-сервер и немедленно закроем его с помощью метода Close:

gopackage 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)
  }
}

Результат выполнения кода:

go"Server closed"

Пример с обработкой ошибок

Давайте обработаем ошибку при закрытии сервера, который не был запущен:

gopackage 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")
  }
}

Результат выполнения кода:

go"Error closing server: close tcp :8080: use of closed network connection"

Пример с использованием в обработчике

Давайте закроем сервер прямо из обработчика запроса:

gopackage 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)
  }
}

Результат выполнения кода:

go"Closing server..."

Смотрите также

  • метод http.Server.Shutdown,
    который плавно завершает работу сервера
  • метод http.Server.ListenAndServe,
    который запускает сервер и слушает входящие запросы
  • константу http.ErrServerClosed,
    которая используется для проверки планового закрытия
  • метод http.Server.Serve,
    который принимает входящие соединения на переданном слушателе