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

240
09 января 2018, 14:22

Задача:

Сервер и клиенты должны обмениваться информацией в реальном времени. Например в виде 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 в начале сообщения от сервера падать перестало. Теперь просто молчит. Ни сервер, ни клиент не получают сообщения. Похоже что клиентская реализация ожидает какой-то последовательности строк от сервера на свои запросы описанной в каком-то стандарте. Отсюда вопрос - неужто надо вычитывать какие-то стандарты или для сервера есть готовые решения, которые позволят сосредоточиться на собственно общении, а не на строгом следовании каким-то там протоколам?

Answer 1

Проблема была в нужде реализации протокола обмена данными между сервером и клиентом. Т.е. сервер должен подтверждать успешность соединения, читать заголовки, отвечать специальными сообщениями и делать прочие реверансы, описанные в стандартах. Использованная сначала на сервере Netty совсем низкоуровневая, протокол там надо самостоятельно реализовывать. Используемые же клиентские либы требовали уже реализованный протокол на сервере. Видимо можно использовать также изначальную реализацию сокетов на клиенте и руками разбирать байты. Но это, конечно, не решение.

В итоге нашёл вот такое решение для сервера: либа Java-WebSocket.

Для клиента использовал либу nv-websocket-client

В итоге получается не ковырять байты, но переругиваться JSON-ами, что и требовалось.

Answer 2

@ЮрийСПб вот сам клиент https://github.com/TooTallNate/Java-WebSocket/blob/master/src/main/java/org/java_websocket/client/WebSocketClient.java вот тут использование https://github.com/TooTallNate/Java-WebSocket/tree/master/src/main/example для андроида желательно клиента оформить в в виде сервиса

READ ALSO
Нажатие клавиш в java

Нажатие клавиш в java

Как можно реализовать нажатие клавиш на Java? Чтобы можно было набирать текст и тд

186
Вывод массива в cardview

Вывод массива в cardview

Получаю данные из JSON страницы, записываю их в массив, при выводе в cardview ничего не выводит (белый экран)Смотрю по logcat данные в массиве есть

221
unit тестирование

unit тестирование

Как бы Вы протестировали данный метод?

170
Android - Retrofit: Не грузит изображения на сервер

Android - Retrofit: Не грузит изображения на сервер

Создал приложение, которое грузит изображения на сервер, использую библиотеку Retrofit

286