Страницы

Поиск по вопросам

четверг, 21 марта 2019 г.

Как организовать общение в формате JSON сервера и клиента по сокетам на Java просто и правильно?

Задача:
Сервер и клиенты должны обмениваться информацией в реальном времени. Например в виде JSON сообщений.
Проблема:
На сервере: Не очень понятно какие есть готовые решения для этой задачи и так ли она решается. В данный момент есть Echo сервер на Netty. Это как-то совсем низкоуровнево. Кажется абсурдным, что надо массивы байтов либо по символу переноса строки отделять друг от друга, либо придумывать какой-то свой разделитель и его отлавливать в байтах.
На клиенте: В качестве клиента, например, берём андроид приложение. Я пробовал https://github.com/socketio/socket.io-client-java но так и не удалось заставить это работать. Попробовал OkHttp, но он сначала шлёт на сервер параметры запроса по адресу (заголовки какие-то etc), а потом выдаёт ошибку при приёме этих его заголовков в ответе сервера: java.net.ProtocolException: Unexpected status line {ТУТ ЗАГОЛОВОК ЗАПРОСА К СЕРВЕРУ}
Вопрос:
Как всё это делается по феншую? Что в гугл вбивать?
Должны же быть какие-то стандарты и библиотеки... Вот только как же их искать(
UPD_0:
После добавления HTTP/1.1 101 Web Socket Protocol Handshake в начале сообщения от сервера падать перестало. Теперь просто молчит. Ни сервер, ни клиент не получают сообщения. Похоже что клиентская реализация ожидает какой-то последовательности строк от сервера на свои запросы описанной в каком-то стандарте. Отсюда вопрос - неужто надо вычитывать какие-то стандарты или для сервера есть готовые решения, которые позволят сосредоточиться на собственно общении, а не на строгом следовании каким-то там протоколам?


Ответ

Проблема была в нужде реализации протокола обмена данными между сервером и клиентом. Т.е. сервер должен подтверждать успешность соединения, читать заголовки, отвечать специальными сообщениями и делать прочие реверансы, описанные в стандартах. Использованная сначала на сервере Netty совсем низкоуровневая, протокол там надо самостоятельно реализовывать. Используемые же клиентские либы требовали уже реализованный протокол на сервере. Видимо можно использовать также изначальную реализацию сокетов на клиенте и руками разбирать байты. Но это, конечно, не решение.
В итоге нашёл вот такое решение для сервера: либа Java-WebSocket
Для клиента использовал либу nv-websocket-client
В итоге получается не ковырять байты, но переругиваться JSON-ами, что и требовалось.

Комментариев нет:

Отправить комментарий