Тип net.TCPConn

Тип net.TCPConn представляет собой TCP-соединение в Go. Он реализует интерфейс net.Conn и предоставляет методы для чтения и записи данных, а также для управления соединением. Объект net.TCPConn возвращается функциями net.Dial, net.DialTCP и net.Accept при работе с TCP. Основные методы типа: Read для чтения данных из соединения, Write для записи данных, Close для закрытия соединения, LocalAddr и RemoteAddr для получения адресов, а также SetDeadline, SetReadDeadline и SetWriteDeadline для установки таймаутов.

Создание TCP-соединения

Для создания клиентского TCP-соединения используется функция net.Dial или net.DialTCP. В первом параметре указывается протокол "tcp", во втором - адрес в формате "host:port". Рассмотрим пример установки соединения с удаленным сервером:

gopackage main

import (
  "fmt"
  "net"
)

func main() {
  conn, err := net.Dial("tcp", "example.com:80")
  if err != nil {
    fmt.Println("Error connecting:", err)
    return
  }
  defer conn.Close()

  fmt.Println("Connected to example.com:80")
}

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

go"Connected to example.com:80"

Чтение данных из соединения

Для чтения данных из TCP-соединения используется метод Read. Он принимает срез байт и возвращает количество прочитанных байт и ошибку. Чтение происходит до тех пор, пока не будет достигнут конец данных или не произойдет ошибка. Рассмотрим пример чтения данных из соединения:

gopackage main

import (
  "fmt"
  "net"
)

func main() {
  conn, err := net.Dial("tcp", "example.com:80")
  if err != nil {
    fmt.Println("Error connecting:", err)
    return
  }
  defer conn.Close()

  // Send HTTP request
  conn.Write([]byte("GET / HTTP/1.0\r\n\r\n"))

  buf := make([]byte, 1024)
  n, err := conn.Read(buf)
  if err != nil {
    fmt.Println("Error reading:", err)
    return
  }

  fmt.Printf("Read %d bytes: %s", n, string(buf[:n]))
}

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

go"Read 256 bytes: HTTP/1.0 200 OK ..."

Запись данных в соединение

Для записи данных в TCP-соединение используется метод Write. Он принимает срез байт и возвращает количество записанных байт и ошибку. Метод гарантирует, что все данные будут записаны или вернет ошибку. Рассмотрим пример отправки данных на сервер:

gopackage main

import (
  "fmt"
  "net"
)

func main() {
  conn, err := net.Dial("tcp", "example.com:80")
  if err != nil {
    fmt.Println("Error connecting:", err)
    return
  }
  defer conn.Close()

  message := []byte("GET / HTTP/1.0\r\n\r\n")
  n, err := conn.Write(message)
  if err != nil {
    fmt.Println("Error writing:", err)
    return
  }

  fmt.Printf("Written %d bytes", n)
}

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

go"Written 18 bytes"

Установка таймаутов

Тип net.TCPConn позволяет устанавливать таймауты на операции чтения и записи с помощью методов SetDeadline, SetReadDeadline и SetWriteDeadline. Это важно для предотвращения зависания при работе с сетью. Рассмотрим пример установки таймаута на чтение:

gopackage main

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

func main() {
  conn, err := net.Dial("tcp", "example.com:80")
  if err != nil {
    fmt.Println("Error connecting:", err)
    return
  }
  defer conn.Close()

  // Set read deadline to 5 seconds
  err = conn.SetReadDeadline(time.Now().Add(5 * time.Second))
  if err != nil {
    fmt.Println("Error setting deadline:", err)
    return
  }

  buf := make([]byte, 1024)
  n, err := conn.Read(buf)
  if err != nil {
    fmt.Println("Read error:", err)
    return
  }

  fmt.Printf("Read %d bytes", n)
}

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

go"Read 0 bytes: i/o timeout"

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

  • интерфейс net.Conn,
    который определяет основные методы для работы с сетевыми соединениями
  • функцию net.Dial,
    которая создает сетевое соединение с указанным протоколом и адресом
  • функцию net.DialTimeout,
    которая создает соединение с таймаутом
  • тип net.TCPAddr,
    который представляет TCP-адрес в Go