Понадобилась отладка клиент-сервера с вебсокетами на Go. Под вебсокеты в Go имеются две библиотеки:
Традиционных утилит под отладку HTTP здесь недостаточно, с вебсокетами по сути мы работаем с другим протоколом, HTTP используется только для инициализации соединения. Поюзав разные онлайновые сервисы, сделал для локальной отладки пару простых утилит — клиент и сервер. Клиент позволяет отправлять произвольные тексты на сервер (text messages в протоколе вебсокетов), сервер работает в режиме «эхо», отфутболивая запросы обратно клиенту. Плюс клиент и сервер обмениваются пингами, как того желают реализации вебсокетных приложений. Логи разной степени подробности валятся на экран, по идее этого достаточно. Глубокого анализа и вывода дампов утилиты принципиально не предполагают, т.к. для этого есть готовые средства — я использую для таких целей Wireshark. Код утилит небольшой, при необходимости, полагаю, несложно будет адаптировать их под другие задачи. Код на гитхабе под GPL.
Готовые бинарники можно скачать отсюда:
- drone.io/github.com/grafov/websocket-utils/files/wsechoserver
- drone.io/github.com/grafov/websocket-utils/files/wsclient
Для самостоятельной пересборки понадобится go-окружение и установка нескольких доп. пакетов:
go get github.com/gorilla/websocket
go get github.com/kdar/factorlog
go get github.com/peterh/liner
- websocket — библиотека из фреймворка Gorilla, я к ней как-то больше привык, ещё со времён черновых версий протокола, до принятия RFC4655.
- factorlog — мой любимый логгер, с цветатым выводом
- liner — удобная либа для реализации интерактивных CLI
Сам набор утилит можно забрать с гитхаба:
git clone http://github.com/grafov/websocket-utils
Сервер по умолчанию слушает на порту 48084 локального интерфейса, с помощью параметра -listen
это можно исправить. Клиенту указываем куда коннектиться с помощью -bind
. Для более подробного вывода происходящих событий параметры -verb
и -debug
.
Клиент позволяет отправлять на сервер содержимое файлов:
< sample-file.json
Или результат исполнения внешних команд:
! ls *.txt
Сервер и клиент поддерживают работу как друг с другом, так и с любыми валидными реализациями вебсокетов. Например:
wsclient -bind=echo.websocket.org
Этот материал на google+.