Интерфейс net.Listener

Интерфейс net.Listener представляет собой объект, который прослушивает сетевые соединения на указанном адресе. Он предоставляет методы для принятия входящих подключений и закрытия слушателя. Основной способ создания слушателя - использование функции net.Listen, которая возвращает реализацию этого интерфейса.

Интерфейс net.Listener содержит три метода: Accept - принимает входящее соединение и возвращает интерфейс net.Conn для обмена данными, Close - закрывает слушатель и освобождает ресурсы, Addr - возвращает сетевой адрес слушателя в виде интерфейса net.Addr.

Синтаксис

gotype Listener interface {
  Accept() (Conn, error)
  Close() error
  Addr() Addr
}

Пример

Создадим простой TCP-сервер, который прослушивает порт 8080 и отвечает приветствием на каждое подключение:

gopackage main

import (
  "fmt"
  "net"
)

func main() {
  // Create a TCP listener on port 8080
  listener, err := net.Listen("tcp", "localhost:8080")
  if err != nil {
    fmt.Println("Error creating listener:", err)
    return
  }
  defer listener.Close()

  fmt.Println("Server is listening on localhost:8080")

  for {
    // Accept incoming connections
    conn, err := listener.Accept()
    if err != nil {
      fmt.Println("Error accepting connection:", err)
      continue
    }

    // Handle connection in a separate goroutine
    go handleConnection(conn)
  }
}

func handleConnection(conn net.Conn) {
  defer conn.Close()

  response := "Hello, client!\n"
  _, err := conn.Write([]byte(response))
  if err != nil {
    fmt.Println("Error writing to connection:", err)
    return
  }

  fmt.Println("Connection handled successfully")
}

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

go"Server is listening on localhost:8080"

Пример

Используем метод Addr для получения сетевого адреса созданного слушателя:

gopackage main

import (
  "fmt"
  "net"
)

func main() {
  listener, err := net.Listen("tcp", ":0")
  if err != nil {
    fmt.Println("Error creating listener:", err)
    return
  }
  defer listener.Close()

  // Get the listener's address
  addr := listener.Addr()
  fmt.Println("Listener address:", addr.String())
  fmt.Println("Network type:", addr.Network())
}

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

go"Listener address: [::]:38673"
"Network type: tcp"

Пример

Закроем слушатель до завершения программы с помощью метода Close. Это освободит порт и остановит прием подключений:

gopackage main

import (
  "fmt"
  "net"
  "time"
)

func main() {
  listener, err := net.Listen("tcp", "localhost:8080")
  if err != nil {
    fmt.Println("Error creating listener:", err)
    return
  }

  fmt.Println("Listener created successfully")

  // Close the listener after 2 seconds
  time.Sleep(2 * time.Second)
  err = listener.Close()
  if err != nil {
    fmt.Println("Error closing listener:", err)
    return
  }

  fmt.Println("Listener closed successfully")

  // Try to accept after close - will fail
  _, err = listener.Accept()
  if err != nil {
    fmt.Println("Accept failed:", err)
  }
}

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

go"Listener created successfully"
"Listener closed successfully"
"Accept failed: use of closed network connection"

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

  • функцию net.Listen,
    которая создает сетевой слушатель
  • интерфейс net.Conn,
    который представляет сетевое соединение
  • функцию net.Dial,
    которая устанавливает соединение с удаленным хостом
  • функцию net.DialTimeout,
    которая устанавливает соединение с таймаутом