Вспомогательные библиотеки
Мы используем несколько вспомогательных библиотек в качестве зависимостей для наших основных компонентов.
Мы публикуем наши библиотеки с помощью JitPack!
JitPack.io — это сервис репозитория пакетов, который позволяет легко обмениваться и распространять библиотеки Java путем сборки исходного кода из Git-репозиториев по запросу.
Процесс публикации новой версии состоит из создания нового тега с именем, соответствующим версии компонента, и его отправки (push).
Для использования необходимо добавить это объявление репозитория в ваш проект:
<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>
MMO Core
MMOCore является фундаментальным компонентом проекта, это библиотека, которая предоставляет абстрактную реализацию сетевого движка.
Она используется Login Server и Game Server для отправки/получения данных от клиентов.
Существует два (основных) метода шифрования/дешифрования, которые должны быть реализованы на игровом сервере.
Обработка буфера выполняется в классе SelectorThread.
Мы используем неблокирующую мультиплексированную однопоточную архитектуру для ввода/вывода плюс пул потоков для обработки принимаемых пакетов. DrHouse
<dependency>
<groupId>org.bitbucket.l2jserver</groupId>
<artifactId>l2j-server-mmocore</artifactId>
<version>2.6.5.0</version>
</dependency>
Обсуждение Asynchronous I/O, Multi-threaded MMOCore и здесь
L2J Geo Driver
Это стандартная реализация движка геодаты (Geodata Engine).
<dependency>
<groupId>org.bitbucket.l2jserver</groupId>
<artifactId>l2j-server-geo-driver</artifactId>
<version>2.6.5.0</version>
</dependency>
L2J Commons
Это служебная библиотека, содержащая несколько классов, которые решают различные проблемы в Login и Game серверах.
<dependency>
<groupId>org.bitbucket.l2jserver</groupId>
<artifactId>l2j-server-commons</artifactId>
<version>2.6.7.0</version>
</dependency>
Служба UPnP
Universal Plug and Play (UPnP) — это набор сетевых протоколов, который позволяет устройствам в локальной сети автоматически обнаруживать друг друга и взаимодействовать. Это упрощает подключение и настройку устройств. UPnP также можно использовать для перенаправления портов (port forwarding), что обеспечивает удаленный доступ к устройствам за маршрутизатором. С помощью UPnP устройства могут запрашивать у маршрутизатора автоматическое создание и управление правилами перенаправления портов, устраняя необходимость ручной настройки маршрутизатора. Это упрощает пользователям удаленный доступ к своим устройствам без необходимости в глубоких сетевых знаниях или сложных процедурах настройки.
Включено по умолчанию.
Фабрика соединений и пул соединений
L2J Server использует чистый JDBC (Java Database Connectivity), это может повысить производительность по сравнению с высокоуровневыми фреймворками, такими как JPA (Java Persistence API), поскольку обеспечивает прямой и низкоуровневый доступ к базе данных, позволяя осуществлять тонкую настройку и оптимизацию SQL-запросов, стратегий выборки данных и специфических функций базы данных.
L2J Server использует пул соединений для управления набором соединений с базой данных, позволяя серверу повторно использовать и совместно использовать соединения. Это помогает повыси ть производительность и масштабируемость за счет снижения накладных расходов на установку новых соединений для каждого запроса.
По умолчанию L2J Server использует HikariCP — высокопроизводительную библиотеку пула соединений JDBC для приложений Java. HikariCP предлагает несколько функций, которые делают его популярным выбором, включая легкость, низкую задержку, высокую пропускную способность и автоматическое управление соединениями.
Движок Blowfish
Алгоритм Blowfish — это симметричный блочный шифр, который работает с блоками данных и использует ключ переменной длины. Он был разработан Брюсом Шнайером в 1993 году и известен своей гибкостью и безопасностью.
Методы tryEncryptBlock и tryDecryptBlock выполняют проверку ошибок, чтобы убедиться, что входные и выходные буферы имеют достаточный размер. Методы encryptBlock и decryptBlock фактически выполняют операции шифрования и дешифрования блоков данных с использованием алгоритма Blowfish.
Утилиты (Utils)
HexUtils
Класс HexUtils — это служебный класс, который предоставляет методы для преобразования данных в шестнадцатеричные представления символов и выполнения связанных операций, таких как создание шестнадцатеричных дампов (hex dumps). Он включает функции для преобразования байтов и целых чисел в их шестнадцатеричные представления, создания дампов массивов байтов и преобразования массивов байтов в символы ASCII.
IPv4Filter
Этот класс представляет собой реализацию фильтра IPv4, который разрешает или запрещает соединения на основе защиты от флуда (flood protection) для определенных IP-адресов.
Rnd
Rnd предоставляет функциональность генерации сл учайных чисел. Он предлагает различные типы генераторов случайных чисел на основе указанного RandomType.
Доступные типы:
- SECURE: использует SecureRandom для наилучшего качества случайных чисел.
- UNSECURE_ATOMIC: использует java.util.Random для среднего качества.
- UNSECURE_THREAD_LOCAL: использует ThreadLocalRandom для скорости параллельного доступа. Каждому потоку соответствует свой экземпляр рандома.
- UNSECURE_VOLATILE: использует NonAtomicRandom для более быстрой скорости параллельного доступа. Может генерировать одно и то же зерно (seed) для двух потоков.
Util
Класс содержит несколько статических методов, предлагающих различные функциональные возможности.
Ниже приведено краткое описание методов, предоставляемых классом Util:
isInternalHostname(String host): проверяет, является ли имя хоста внутренним, проверяя, является ли оно локальным адресом сайта или адресом обратной петли (loopback).printData(byte[] data, int len): генерирует шестнадцатеричное представление массива байтов. Принимает массив байтов и длину данных и возвращает шестнадцатеричное представление в виде строки.printData(byte[] data): сокращение для printData(byte[] data, int len), печатает весь массив байтов в шестнадцатеричном формате.printData(ByteBuffer buf): представляет оставшиеся байты ByteBuffer в виде шестнадцатеричной строки.generateHex(int size): генерирует случайную последовательность байтов указанного размера и возвращает ее в виде массива байтов.getStackTrace(Throwable t): принимает объект Throwable и возвращает его трассировку стека в виде строки.replaceIllegalCharacters(String str): заменяет большинство недопустимых символов в строке символом подчеркивания.isValidFileName(String name): проверяет допустимость имени файла, создавая объект File с заданным именем и проверяя возможность получения его канонического пути.splitWords(String input): разделяет слова в строке, вставляя пробел между строчной буквой, за которой следует заглавная.getNextClosestDateTime(DayOfWeek[] daysOfWeek, int hour, int min): вычисляет следующую ближайшую дату из указанных дней недели в указанный час и минуту.getNextClosestDateTime(List<DayOfWeek> daysOfWeek, int hour, int min): перегруженная версия предыдущего метода, принимающая список объектов DayOfWeek вместо массива.mapToFunction(Map<K, V> map): преобразует карту (map) в функцию, где функция возвращает значение, связанное с заданным ключом в карте.parseArg(String[] args, String arg, boolean hasArgValue): анализирует заданный аргумент из аргументов программы Java.randomPassword(int length): генерирует случайный пароль указанной длины, содержащий комбинацию строчных, прописных букв и цифр.