Введение в WebSocket в Go
После обычного HTTP-запроса связь обычно заканчивается вместе с ответом. Протокол WebSocket сначала проходит тот же обмен заголовками, а затем оставляет открытое соединение. По нему стороны шлют сообщения туда и обратно, не открывая новый запрос на каждую фразу.
Такой канал удобен для уведомлений, чатов и простых игр, где сервер сам может написать клиенту, а не только отвечать на очередной просмотр страницы. Формат кадров уже разобран библиотекой: в коде работают с готовым объектом соединения, а не с сырыми байтами рукопожатия.
В стандартной поставке Go нет готового
типа для этого протокола. На практике
берут модуль github.com/gorilla/websocket.
Из корня проекта, где лежит go.mod,
зависимость добавляют командой
go get github.com/gorilla/websocket;
номер версии в уроке не фиксируют,
его подставит сам инструмент модулей.
В этом разделе поднимем HTTP-сервер с
переводом на канал сообщений, откроем
клиент по адресу со схемой ws, прочитаем
и отправим текст, соберем несколько
соединений в карте под замком, сделаем
рассылку и аккуратное закрытие. Файлы
и первые предложения: server/ru.html
(сервер поднимает обычный HTTP и на одном
пути переводит соединение в сообщения),
client/ru.html (клиент сам открывает
адрес со схемой ws и дальше пишет сообщения),
exchange/ru.html (сервер читает текст
и отвечает в то же соединение),
several/ru.html (каждое соединение
держат в карте, чтобы не потерять его),
broadcast/ru.html (одно сообщение
можно отправить всем, кто сейчас в карте),
close/ru.html (соединение закрывают
и убирают из карты, чтобы не писать в него
дальше), practice/ru.html (в этих
задачах потренируем сервер, сообщение
и ответ).