Тип 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". Рассмотрим пример установки соединения с удаленным сервером:
package 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")
}
Результат выполнения кода:
"Connected to example.com:80"
Чтение данных из соединения
Для чтения данных из TCP-соединения используется метод Read. Он принимает срез байт и возвращает количество прочитанных байт и ошибку. Чтение происходит до тех пор, пока не будет достигнут конец данных или не произойдет ошибка. Рассмотрим пример чтения данных из соединения:
package 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]))
}
Результат выполнения кода:
"Read 256 bytes: HTTP/1.0 200 OK ..."
Запись данных в соединение
Для записи данных в TCP-соединение используется метод Write. Он принимает срез байт и возвращает количество записанных байт и ошибку. Метод гарантирует, что все данные будут записаны или вернет ошибку. Рассмотрим пример отправки данных на сервер:
package 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)
}
Результат выполнения кода:
"Written 18 bytes"
Установка таймаутов
Тип net.TCPConn позволяет устанавливать таймауты на операции чтения и записи с помощью методов SetDeadline, SetReadDeadline и SetWriteDeadline. Это важно для предотвращения зависания при работе с сетью. Рассмотрим пример установки таймаута на чтение:
package 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)
}
Результат выполнения кода:
"Read 0 bytes: i/o timeout"
Смотрите также
-
интерфейс
net.Conn,
который определяет основные методы для работы с сетевыми соединениями -
функцию
net.Dial,
которая создает сетевое соединение с указанным протоколом и адресом -
функцию
net.DialTimeout,
которая создает соединение с таймаутом -
тип
net.TCPAddr,
который представляет TCP-адрес в Go