Интерком между Javascript и Java — Websocket

Недавно я столкнулся со сценарием, в котором мне нужно, чтобы мое приложение Java Desktop нуждалось в функции триггера из Javascript (расширение Chrome) на веб-странице, которую я открываю на своем локальном компьютере. но я узнаю, что это возможно, только создав сервер веб-API на Java и заставив веб-сайт (расширение Chrome) отвечать/запрашивать через API.

Но создание сервера, работающего в Java-приложении Swing, не имеет смысла, так как это блокирует шоу, пока сервер не закроется, приложение Swing не сможет реагировать на мои клики или любую другую параллельную активность.

Заставлять сервер работать в другом процессе тоже не эффективно, так как здесь отсутствует основное достижение (перенос веб-данных из Js в Java).

Поэтому я подумал о разработке WebSocket, с помощью которого два объекта могут общаться друг с другом через сокет и не нуждаться в трехэтапном рукопожатии каждый раз.

Итак, что я сделал, так это создал Socket Server в своем приложении Java Swing, который будет работать в отдельном потоке и будет готов принимать ответ WS от любого приложения через номер порта, который я назначил. .

Еще одно свойство, с которым я столкнулся, заключается в том, что в последней версии Java функция ReadLine() объявлена ​​устаревшей из класса DataInputStream.

Функция ReadUTF() считывает только строку в кодировке Modified UTF-8, которая может быть записана только другим методом, называемым WriteUTF() в самой Java. . Здесь я хочу, чтобы мой Javascript взаимодействовал с Java, которая принимает только модифицированную строку в кодировке UTF-8, в которой Javascript не имеет кодировки «mutf8». Существует некоторая библиотека узлов под названием «mutf8», которая может преобразовать ваш формат UTF8 в формат MUTF8, но по-прежнему не работает.

Затем, наконец, я нашел альтернативный способ выполнить свою задачу, я использовал класс Scanner для получения данных из getInputStream() Socket.

(без использования метода ReadUTF())

Поскольку я создал такую ​​функциональность на Java, мне нужен Socket Client на стороне Javascript. У вас есть много библиотек для выполнения вызовов сокетов в node js, таких как socket.io, node: net и т. д.

Так как мы собираемся сделать вызов из браузера, у нас не может быть таких библиотек в сети, как мы используем в node. Эти библиотеки будут поддерживаться только в узле, а не в веб-браузере.

Таким образом, единственный способ использовать традиционный вызов WebSocket

let socket = new WebSocket("ws://127.0.0.1:9999");

Большой !!! 🎊 , теперь мы установили соединение с Javascript на Java. но как мы отправляем данные???

поэтому, используя вызов WebSocket, мы можем отправить данные на сервер Java. с помощью метода под названием «Отправить»

socket.send("Hello from JavaScript");

Здесь другая проблема заключается в несоответствии кодировки метода отправки, используемого JavaScript, который Java не понимает, и Java возвращает какой-то мусорный текст после получения вызова в этом порту.

Таким образом, окончательное решение заключается в отправке данных в самом URL-адресе в качестве параметра. поэтому Java распечатывает параметр, который мы передаем через вызов WebSocket.

let socket = new WebSocket("ws://127.0.0.1:9999?message=HelloFromJs");

как только вы создадите свой Javascript для добавления ваших данных к URL-адресу для передачи, вы можете правильно связаться с сервером Java.

Как только сокетное соединение будет установлено, Java Server напечатает следующее:

GET ?message=HelloFromJs HTTP/1.1

Используя такую ​​строку, вы можете обрезать или разделить ее, чтобы извлечь данные, необходимые для продолжения.

Вау 🥳, мы сделали связь между Javascript и Java с помощью WebSockets.

Заключение

Спасибо за чтение, я надеюсь, что этот блог поможет. Пожалуйста, следуйте за мной для получения дополнительных обновлений 😇

Оставайся на связи

LinkedIn * Github * Medium