TCP и UDP в Go
См. также: Асинхронность и горутины · Веб на stdlib · Простые приложения.
Уровни сетевого стека
| Уровень | Пакет Go | Пример |
|---|---|---|
| HTTP | net/http | REST, веб-страницы |
| TCP/UDP | net | Сокеты, игры, брокеры, кастомные протоколы |
| IP и ниже | net, syscall | Редко в прикладном коде |
HTTP поверх TCP уже разбирает заголовки, тело, keep-alive. Ниже — поток байтов без семантики запрос/ответ.
TCP-сервер (echo)
func main() {
ln, err := net.Listen("tcp", ":9000")
if err != nil {
log.Fatal(err)
}
defer ln.Close()
for {
conn, err := ln.Accept()
if err != nil {
log.Print(err)
continue
}
go handleConn(conn) // одна горутина на соединение
}
}
func handleConn(c net.Conn) {
defer c.Close()
io.Copy(c, c) // эхо: всё прочитанное — обратно клиенту
}
net.Conn реализует io.Reader и io.Writer — удобно стыкуется с буферами и протоколами.
TCP-клиент
conn, err := net.Dial("tcp", "localhost:9000")
if err != nil {
log.Fatal(err)
}
defer conn.Close()
_, err = conn.Write([]byte("ping\n"))
buf := make([]byte, 1024)
n, err := conn.Read(buf)
Dial с таймаутом:
d := net.Dialer{Timeout: 5 * time.Second}
conn, err := d.DialContext(ctx, "tcp", host)
UDP
UDP — дейтаграммы без установления сессии:
addr, _ := net.ResolveUDPAddr("udp", ":9001")
conn, _ := net.ListenUDP("udp", addr)
defer conn.Close()
buf := make([]byte, 65507) // макс. размер UDP payload
n, remote, err := conn.ReadFromUDP(buf)
_, err = conn.WriteToUDP(buf[:n], remote)
Клиент: net.Dial("udp", "host:9001") или ListenUDP только на стороне сервера.
Подходит для DNS-подобных запросов, телеметрии, игр; порядок и доставка не гарантированы — это закладывают в протокол.
Буферизация и протокол
Сырые Read могут вернуть часть сообщения. Для текстовых протоколов — bufio.Scanner или bufio.Reader.ReadString('\n'). Для бинарных — длина кадра в заголовке (4 байта LE + payload).
scanner := bufio.NewScanner(conn)
for scanner.Scan() {
line := scanner.Text()
// обработка строки
}
Установите scanner.Buffer и MaxScanTokenSize, если строки длинные.
Связь с горутинами
Паттерн «одно TCP-соединение — одна горутина» масштабируется на тысячи клиентов за счёт лёгких горутин (асинхронность). Блокирующий Read в горутине не блокирует весь сервер.
Ограничение нагрузки: семафор, net.Listen с лимитом через обёртку, или пул воркеров с очередью соединений.
TLS поверх TCP
tls.Listen / tls.Dial оборачивают TCP шифрованием. HTTP-сервер с TLS обычно настраивают через http.Server и ListenAndServeTLS, а не вручную на сыром сокете.
HTTP и сырой сокет
| Критерий | net/http | net TCP/UDP |
|---|---|---|
| Формат | Запрос/ответ, заголовки | Свой протокол |
| Инструменты | Middleware, JSON, шаблоны | Полный контроль |
| Типичное применение | API, сайты | Игры, VPN-части, агенты |
Для обучения достаточно echo-сервера; для продакшена API чаще выбирают HTTP (веб на stdlib или фреймворки).
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). Основы языка Go - философия простоты, модель компиляции и идиоматичный подход к системной разработке. Go — это статически типизированный язык программирования общего назначения, разработанный компанией Google для создания эффективных, масштабируемых и надежных систем. Набор советов, правил, принципов и обычаев в разработке на этом языке. История Go - инженерные цели языка, философия простоты и эволюция инструментов экосистемы. Экосистема приложений на Go - встроенные инструменты, workflow разработки и практики сопровождения проектов. Кавычки, rune и string, точка, запятая, автоматическая вставка точки с запятой, скобки, подчёркивания и типичные ошибки новичков в Go. Предопределённые идентификаторы не являются ключевыми словами, но имеют специальное значение в языке. Их можно переопределить в локальной области видимости, но делать это не рекомендуется. Набор функций, которые включены в стандартную библиотеку языка. Особенности Go - интерфейсы, композиция, модель ошибок и практики написания поддерживаемого кода. Go вводит конкурентность через встроенные синтаксические конструкции и правила выполнения. Ниже рассматриваются основные направления практического применения Go, объяснённые через призму его технических характеристик и требований реальных инфраструктур. Типизация, набор правил определения типа данных значений языка.Основы языка Go
Что требуется знать перед началом изучения языка программирования Go
Рекомендации по разработке на Go
История языка Go
Экосистема приложений на Go
Синтаксис и пунктуация в Go
Ключевые слова языка Go
Встроенные функции и пакеты Go
Особенности языка Go
Синтаксические конструкции Go
Области применения Go
Типы данных и объявление переменных в Go