Использование 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выполняет рукопожатие; проверяйтеCheckOriginUpgradeвозвращает*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 — локальная установка не требуется.
Все уроки этого курса
- Основы WebSocket
- Использование gorilla/websocket
- Трансляция сообщений
- Управление соединениями