Интерфейс net.Listener
Интерфейс net.Listener представляет собой объект,
который прослушивает сетевые соединения на указанном адресе.
Он предоставляет методы для принятия входящих подключений
и закрытия слушателя. Основной способ создания слушателя -
использование функции net.Listen, которая возвращает
реализацию этого интерфейса.
Интерфейс net.Listener содержит три метода:
Accept - принимает входящее соединение и возвращает
интерфейс net.Conn для обмена данными,
Close - закрывает слушатель и освобождает ресурсы,
Addr - возвращает сетевой адрес слушателя в виде
интерфейса net.Addr.
Синтаксис
type Listener interface {
Accept() (Conn, error)
Close() error
Addr() Addr
}
Пример
Создадим простой TCP-сервер, который прослушивает порт 8080 и отвечает приветствием на каждое подключение:
package 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")
}
Результат выполнения кода:
"Server is listening on localhost:8080"
Пример
Используем метод Addr для получения сетевого адреса
созданного слушателя:
package 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())
}
Результат выполнения кода:
"Listener address: [::]:38673"
"Network type: tcp"
Пример
Закроем слушатель до завершения программы с помощью метода
Close. Это освободит порт и остановит прием
подключений:
package 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)
}
}
Результат выполнения кода:
"Listener created successfully"
"Listener closed successfully"
"Accept failed: use of closed network connection"
Смотрите также
-
функцию
net.Listen,
которая создает сетевой слушатель -
интерфейс
net.Conn,
который представляет сетевое соединение -
функцию
net.Dial,
которая устанавливает соединение с удаленным хостом -
функцию
net.DialTimeout,
которая устанавливает соединение с таймаутом