Следите за новинками
в нашем Telegram канале. Жми, чтобы подписаться:)
⊗goSpWsSv 262 of 280 menu
◀ ▶

WebSocket-сервер в Go

Серверная сторона опирается на уже знакомый пакет net/http. Сначала слушают локальный адрес, как для обычных страниц; отдельный путь получает функцию, которая не пишет HTML, а переводит запрос в долгоживущее соединение библиотеки.

Для перевода создают значение типа websocket.Upgrader с настройками по умолчанию. Его метод принимает объект ответа, запрос и необязательные заголовки; при успехе возвращают объект соединения, с которым дальше работают в том же обработчике или в горутине.

Минимальный сервер на 127.0.0.1:8080 с путем /ws и переводом без обмена текстом:

package main import ( "log" "net/http" "github.com/gorilla/websocket" ) func main() { upgrader := websocket.Upgrader{} http.HandleFunc("/ws", func(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println(err) return } defer conn.Close() }) if err := http.ListenAndServe("127.0.0.1:8080", nil); err != nil { log.Fatal(err) } }

Пока обработчик только принимает связь и сразу закрывает ее при выходе. Ошибку перевода печатают и выходят из функции, не ломая весь процесс прослушивания.

Тот же каркас с явной переменной обновляющего объекта перед регистрацией пути:

package main import ( "log" "net/http" "github.com/gorilla/websocket" ) var upgrader = websocket.Upgrader{} func wsHandler(w http.ResponseWriter, r *http.Request) { conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println(err) return } defer conn.Close() } func main() { http.HandleFunc("/ws", wsHandler) log.Fatal(http.ListenAndServe("127.0.0.1:8080", nil)) }

Дан путь:

path := "/ws"

Напишите полный main.go: зарегистрируйте path на прослушивании 127.0.0.1:8080 и в обработчике переведите запрос в канал сообщений модуля github.com/gorilla/websocket.

Дан фрагмент после успешного перевода:

conn, err := upgrader.Upgrade(w, r, nil) if err != nil { log.Println(err) return }

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

Скажите, чем обработчик пути /ws отличается от обработчика, который просто печатает текст "ok" в ответ HTTP.

← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить