Друкарня від WE.UA

Java. Десктопний застосунок для керування іншими комп’ютерами в локальній мережі за 15 хв

Частково клікбейт 🙂 — тільки для керування курсором миші.
Але розширивши функціонал, можна буде контролювати практично все.

Архітектура

Sender буде відправляти координати миші.
Receiver буде обробляти ці дані і застосувати дані координати у себе.
Таким чином, у нас буде симуляції контролю миші іншого пристрою.

Надсилаючи якісь дані, отримувач має знати як їх обробити.
Для цього існують протоколи - спосіб, за допомогою якого дві або більше сторони домовляються про формат обміну інформацією. Він визначає, які кроки слід виконувати, які повідомлення слід відправляти, як вони мають бути структуровані, і як системи повинні реагувати на отримані повідомлення.

Ми могли б використати вже існуючий протокол, наприклад, HTTP. Але давайте зробимо невеличкий велосипед.

Наш “протокол“ буде складатися з:
- Назви команди
- Символу нового рядка, щоб мати змогу розділити назву і дані
- Самих даних, необхідних для виконання цієї команди

Супер-пупер протокол
Супер-пупер протокол

[Sender]

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Sender extends Application {

    private CommandSender commandSender;

    @Override
    public void start(Stage primaryStage) throws Exception {
        FXMLLoader loader = new FXMLLoader(Sender.class.getResource("main.fxml"));
        Scene scene = new Scene(loader.load());
        commandSender = new CommandSender();
        applySendingListener(scene);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void applySendingListener(Scene scene) {
        scene.setOnMouseMoved(commandSender::sendMouseCommand);
    }
}
import javafx.scene.input.MouseEvent;

import java.io.IOException;
import java.io.OutputStream;
import java.net.Socket;

public class CommandSender {

    public void sendMouseCommand(MouseEvent event) {
        int sceneX = (int) event.getSceneX();
        int sceneY = (int) event.getSceneY();
        String msg = String.format(Constants.MOUSE_CMD_TEMPLATE, sceneX, sceneY);
        sendMessage(msg);
    }

    private void sendMessage(String msg) {
       try(var socket = new Socket(Constants.IP, Constants.port);
           OutputStream outputStream = socket.getOutputStream();) {
           outputStream.write(msg.getBytes());
           outputStream.flush();
       } catch (IOException e) {
           throw new RuntimeException(e);
       }
    }
}
public interface Constants {
    String IP = "..local ip address";
    int port = ..desired port;

    String MOUSE_CMD_TEMPLATE = """
            CursorCommand
            %s,%s""";
}

Receiver

import java.awt.*;
import java.io.IOException;
import java.io.InputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Receiver {

    private static Robot robot;

    public static void main(String[] args) throws Exception {
        robot = new Robot();
        ServerSocket socket = new ServerSocket(8766);
        while (true) {
            handleConnection(socket.accept());
        }
    }

    private static void handleConnection(Socket accept) throws IOException {
        try(accept;
            InputStream inputStream = accept.getInputStream()) {
            byte[] bytes = inputStream.readAllBytes();
            String unparsedCmd = new String(bytes);
            String[] cmdNameAndData = unparsedCmd.split("\n");
            String commandName = cmdNameAndData[0];
            String data = cmdNameAndData[1];
            System.out.println(data);
            handleCommand(commandName, data);
        }
    }

    private static void handleCommand(String commandName, String data) {
        // choose command by cmd name, but we have only one command
        String[] coordinates = data.split(",");
        int x = Integer.parseInt(coordinates[0]);
        int y = Integer.parseInt(coordinates[1]);
        robot.mouseMove(x, y);
    }
}

Результат (це прикріплене відео до мого незакінчего пет-проекту в гітхабі, який є аналогом цього коду, бо зараз немає вільної машини, щоб протестувати, точніше, тестував на локальній машині, але відос вийшов би не дуже ефектним)

https://user-images.githubusercontent.com/72043323/166488147-41cbd774-f5f0-4f12-8622-660a7a61e909.mp4


Тут гора і трішки речей які можна покращати:

  • У нас захардкоджений адрес локальної машини, на яку ми надсилаємо команди. Можна використовувати звичайний пінг в межах 192.168.*.*, щоб вияснити, які машини доступні в мережі

  • Ми беремо координати відносно сцени, розмір якої може бути наприклад 600×500. Тобто, в нас зміна координат буде відбуватися саме в цьому діапазоні. Тому нам потрібно знати як скейлити/трансформути ці координати відносно роздільної здатності під кожен пристрій.

    Нам потрібно буде з керуючої машини кидати GetInitialDataRequest, який би повертав дані про роздільну здатність.
    Ми б зберігали в пам’яті інформацію про роздільну здатність відносно кожного пристрою в локальній мережі.

  • Додати команду для кліку, управлінням клавіатури, etc.

  • Оскільки об’єкт події йде від ОС і дуже часто, виникає “дублікація“ координат і ми надсилаємо зайві дані, створюючи непотрібне навантаження

  • На кожну подію ми відкриваємо сокет. Ми можемо оптимізувати мережеву комунікацію, створюючи тільки один сокет, який буде відкритий

  • Рефакторинг коду


Цей довгочит — стиснута версія мого незакінченого пет-проекту.
Оскільки це лінк на гітхаб, там одразу можна взяти потикати код.

Статті про вітчизняний бізнес та цікавих людей:

  • Як побудована програма Meest China Academy

    Курс про товарний бізнес охоплює різні етапи роботи: від пошуку ідеї до перевірки товару, логістики та масштабування. Програма Meest China Academy містить 17 модулів, які послідовно розкривають ці теми без зведення всього навчання до однієї універсальної поради.

    Теми цього довгочиту:

    Meest
  • Які технології використані в Айфон 17

    Айфон 17 поєднує OLED-дисплей із частотою до 120 Гц, чип A19, дві камери Fusion 48 Мп і швидке заряджання через USB-C. У COMFY можна купити Айфон 17 з накопичувачем на 256 або 512 ГБ, вибравши конфігурацію відповідно до обсягу фото, відео та застосунків

    Теми цього довгочиту:

    Iphone 17
  • Як вибрати вживаний iPhone: коротке керівництво для розумної покупки

    Вторинний ринок смартфонів Apple активно зростає, і питання, як вибрати вживаний iPhone, стає актуальним для дедалі більшої кількості користувачів. Правильний підхід дозволяє отримати бу iPhone з актуальною iOS і доброю камерою за помітно нижчу ціну, ніж у нових пристроїв.

    Теми цього довгочиту:

    Iphone
  • Як подолати жіночу безплідність за допомогою донорських яйцеклітин

    Діагноз "безпліддя" рідко звучить як вирок одразу. Для багатьох жінок саме в цей момент вперше звучить словосполучення "донорські яйцеклітини" — і це часто не кінець шляху до материнства, а якраз новий, реальний шанс.

    Теми цього довгочиту:

    Донорство
  • Як заспокоїти зубний біль і чому самолікування може призвести до операції?

    Раптовий біль у зубі може призвести до порушення сну та ускладненого вживання їжі. Люди часто приймають таблетки, роблять полоскання або лікуються народними засобами. В таких випадках не варто відкладати візит до стоматолога, адже можуть з’явитись ускладнення.

    Теми цього довгочиту:

    Стоматологія
Поділись своїми ідеями в новій публікації.
Ми чекаємо саме на твій довгочит!
Oleksandr Klymenko
Oleksandr Klymenko@overpathz

Java Software Engineer

40Довгочити
9.4KПерегляди
104Підписники
На Друкарні з 19 квітня 2023

Більше від автора

  • Java Memory Model ↔ PostgreSQL MVCC: один і той самий фундамент конкурентності

    Java Memory Model та PostgreSQL MVCC/Isolation Levels — це дві відповіді на одне й те саме фундаментальне питання: за яких умов зміна, зроблена одним учасником (потоком / транзакцією), стає видимою для іншого?

    Теми цього довгочиту:

    Java
  • Як виконується SQL-запит

    Сьогодні розберемо, що відбувається з вашим SELECT * FROM users WHERE age > 21 перед тим, як БД поверне вам дані

    Теми цього довгочиту:

    Computer Science

Це також може зацікавити:

Коментарі (2)

Доволі цікаво, а яка практична цінність вашого ПЕТ проекту, рухатиметься в сторону тім в’ювера, хакерського софта чи це шоб просто щоб підтягнути власні навички ?

Це також може зацікавити: