0Pricing
Go Academy · Урок

Использование gorilla/websocket

Устанавливайте соединения и обрабатывайте их

«Использование gorilla/websocket» — бесплатный урок Go Academy на CoddyKit. Это урок 2 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Библиотека gorilla/websocket

gorilla/websocket — наиболее широко используемая библиотека Go для WebSocket. Она выполняет рукопожатие обновления и предоставляет объект соединения для чтения и записи кадров. Установите её с помощью go get github.com/gorilla/websocket.

import "github.com/gorilla/websocket"

Модуль обновления соединения

Upgrader превращает HTTP-запрос в соединение WebSocket. Вы настраиваете размеры буферов и проверку источника запроса.

var upgrader = websocket.Upgrader{
    ReadBufferSize:  1024,
    WriteBufferSize: 1024,
}

Проверка CheckOrigin и безопасность

По умолчанию модуль обновления отклоняет запросы из других источников. Во время разработки проверку можно ослабить, но в рабочей среде проверяйте заголовок Origin, чтобы предотвратить межсайтовый захват WebSocket-соединения.

upgrader.CheckOrigin = func(r *http.Request) bool {
    return r.Header.Get("Origin") == "https://myapp.com"
}

Обновление соединения в обработчике

Внутри http.HandlerFunc вызовите Upgrade. При успехе вы получите *websocket.Conn.

func wsHandler(w http.ResponseWriter, r *http.Request) {
    conn, err := upgrader.Upgrade(w, r, nil)
    if err != nil {
        return
    }
    defer conn.Close()
    // read/write loop here
}

Чтение сообщений

ReadMessage блокирует выполнение до получения кадра, возвращая тип сообщения и байты полезной нагрузки.

mt, data, err := conn.ReadMessage()
if err != nil {
    return // client closed or error
}
fmt.Printf("got %d bytes\n", len(data))
_ = mt

Запись сообщений

WriteMessage отправляет кадр указанного типа:

err := conn.WriteMessage(websocket.TextMessage, []byte("hello"))
if err != nil {
    return
}

Цикл эхо-ответа

Классический пример читает сообщение и отправляет его обратно. Цикл завершается, когда чтение возвращает ошибку, то есть клиент отключился.

for {
    mt, msg, err := conn.ReadMessage()
    if err != nil {
        break
    }
    conn.WriteMessage(mt, msg)
}

Помощники JSON

gorilla предоставляет ReadJSON и WriteJSON, которые напрямую упаковывают значения Go в JSON и передают их через сокет. Это удобно для структурированных сообщений. В исходном коде поле структуры Msg содержит тег json:"text".

type Msg struct {
    Text string // tag: json text
}
var m Msg
conn.ReadJSON(&m)
conn.WriteJSON(Msg{Text: "ack"})

Правило: один читатель, один писатель

Важно: одно соединение допускает только одного одновременно работающего читателя и одного одновременно работающего писателя. Если несколько горутин выполняют запись, используйте мьютекс или направляйте все записи через одну горутину, как будет показано в разделе о рассылке сообщений.

Регистрация маршрута

Подключите обработчик так же, как любой маршрут HTTP. Клиенты подключаются по адресу ws://host/ws.

http.HandleFunc("/ws", wsHandler)
http.ListenAndServe(":8080", nil)

Исполняемый пример: обмен JSON туда и обратно

Для кода WebSocket нужна внешняя библиотека; этот фрагмент стандартной библиотеки повторяет работу ReadJSON/WriteJSON: распаковывает входящее сообщение в отображение и упаковывает ответ.

package main

import (
    "encoding/json"
    "fmt"
)

func main() {
    in := []byte("{\"text\":\"ping\"}")
    var m map[string]string
    json.Unmarshal(in, &m)
    reply, _ := json.Marshal(map[string]string{"text": m["text"] + "-ack"})
    fmt.Println(string(reply))
}

Проверка

Проверьте своё понимание использования gorilla/websocket.

Повторение

Вы научились использовать gorilla/websocket:

  • Upgrader выполняет рукопожатие; проверяйте CheckOrigin
  • Upgrade возвращает *websocket.Conn
  • Используйте ReadMessage/WriteMessage или помощники для JSON
  • Для каждого соединения одновременно допускаются один читатель и один писатель

Часто задаваемые вопросы

Урок «Использование gorilla/websocket» бесплатный?

Да — полный текст урока «Использование gorilla/websocket» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Использование gorilla/websocket»?

Устанавливайте соединения и обрабатывайте их Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 2 из 4.

Сколько времени занимает урок «Использование gorilla/websocket»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Основы WebSocket
  2. Использование gorilla/websocket
  3. Трансляция сообщений
  4. Управление соединениями
← Назад к Go Academy