Интерком между 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.
Заключение
Спасибо за чтение, я надеюсь, что этот блог поможет. Пожалуйста, следуйте за мной для получения дополнительных обновлений 😇