Μετάβαση στο κύριο περιεχόμενο

Βοηθητικές Βιβλιοθήκες

Χρησιμοποιούμε αρκετές βοηθητικές βιβλιοθήκες ως εξαρτήσεις για τα κύρια συστατικά μας.

Δημοσιεύουμε τις βιβλιοθήκες μας χρησιμοποιώντας το JitPack!

Το JitPack.io είναι μια υπηρεσία αποθετηρίου πακέτων που επιτρέπει την εύκολη κοινή χρήση και διανομή βιβλιοθηκών Java μέσω της κατασκευής (building) πηγαίου κώδικα από αποθετήρια Git κατ' απαίτηση (on-demand).

Η διαδικασία δημοσίευσης μιας νέας έκδοσης συνίσταται στη δημιουργία μιας νέας ετικέτας (tag) με το όνομα ως έκδοση του συστατικού και την προώθησή της (push).

Απαιτείται να προσθέσετε αυτή τη δήλωση αποθετηρίου στο έργο σας για να το χρησιμοποιήσετε:

<repositories>
<repository>
<id>jitpack.io</id>
<url>https://jitpack.io</url>
</repository>
</repositories>

MMO Core

Το MMOCore είναι ένα θεμελιώδες συστατικό του έργου, είναι μια βιβλιοθήκη που παρέχει μια αφηρημένη υλοποίηση μηχανής δικτύου. Χρησιμοποιείται από τον Login Server και τον Game Server για την αποστολή/λήψη δεδομένων προς/από τους clients, υπάρχουν δύο (κύριες) μέθοδοι για κρυπτογράφηση/αποκρυπτογράφηση που πρέπει να υλοποιηθούν στον game server. Ο χειρισμός του buffer γίνεται στην κλάση SelectorThread.

Χρησιμοποιούμε μια μη μπλοκαρισμένη (non-blocking) πολυπλεγμένη (multiplexed) αρχιτεκτονική single-threaded για είσοδο/έξοδο συν ένα thread-pool για την επεξεργασία των πακέτων που λαμβάνονται. 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 server.

<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), το οποίο επιτρέπει την απομακρυσμένη πρόσβαση σε συσκευές πίσω από έναν δρομολογητή (router). Με το UPnP, οι συσκευές μπορούν να ζητήσουν από τον δρομολογητή να δημιουργήσει και να διαχειριστεί αυτόματα κανόνες προώθησης θυρών, εξαλείφοντας την ανάγκη για χειροκίνητη διαμόρφωση του δρομολογητή. Αυτό διευκολύνει τους χρήστες να ενεργοποιούν την απομακρυσμένη πρόσβαση στις συσκευές τους χωρίς να απαιτούν εκτεταμένες γνώσεις δικτύωσης ή πολύπλοκες διαδικασίες ρύθμισης.

info

Ενεργοποιημένο από προεπιλογή.

Εργοστάσιο Σύνδεσης και Δεξαμενή Συνδέσεων (Connection Pool)

Το L2J Server χρησιμοποιεί απλό JDBC (Java Database Connectivity), μπορεί να βελτιώσει την απόδοση σε σχέση με πλαίσια υψηλότερου επιπέδου όπως (high-level frameworks) το JPA (Java Persistence API) ή άλλες επιλογές επειδή παρέχει άμεση και χαμηλού επιπέδου πρόσβαση στη βάση δεδομένων, επιτρέποντας λεπτομερή έλεγχο και βελτιστοποίηση των ερωτημάτων SQL, των στρατηγικών ανάκτησης δεδομένων και των χαρακτηριστικών που αφορούν συγκεκριμένα τη βάση δεδομένων.

Ο L2J Server χρησιμοποιεί μια δεξαμενή συνδέσεων (connection pool) για τη διαχείριση μιας ομάδας συνδέσεων βάσης δεδομένων, επιτρέποντας στον server να επαναχρησιμοποιεί και να μοιράζεται συνδέσεις με μια βάση δεδομένων. Βοηθά στη βελτίωση της απόδοσης και της επεκτασιμότητας μειώνοντας το κόστος δημιουργίας νέων συνδέσεων βάσης δεδομένων για κάθε αίτημα.

Από προεπιλογή, ο L2J Server χρησιμοποιεί το HikariCP, μια βιβλιοθήκη δεξαμενής συνδέσεων JDBC υψηλής απόδοσης για εφαρμογές Java. Το HikariCP προσφέρει αρκετά χαρακτηριστικά που το καθιστούν δημοφιλή επιλογή για connection pooling, συμπεριλαμβανομένου του ελαφριού αποτυπώματος (lightweight footprint), της χαμηλής καθυστέρησης (low latency), της υψηλής διεκπερατωτικής ικανότητας (high throughput) και της αυτόματης διαχείρισης συνδέσεων.

Μηχανή Blowfish

Ο αλγόριθμος Blowfish είναι ένας συμμετρικός κρυπτογράφος μπλοκ (symmetric block cipher) που λειτουργεί σε μπλοκ δεδομένων και χρησιμοποιεί κλειδί μεταβλητού μήκους. Σχεδιάστηκε από τον Bruce Schneier το 1993 και είναι γνωστός για την ευελιξία και την ασφάλειά του.

Οι μέθοδοι tryEncryptBlock και tryDecryptBlock εκτελούν έλεγχο σφαλμάτων για να διασφαλίσουν ότι τα buffers εισόδου και εξόδου έχουν επαρκές μέγεθος. Οι μέθοδοι encryptBlock και decryptBlock εκτελούν στην πραγματικότητα τις λειτουργίες κρυπτογράφησης και αποκρυπτογράφησης στα μπλοκ δεδομένων χρησιμοποιώντας τον αλγόριθμο Blowfish.

Εργαλεία (Utils)

HexUtils

Η κλάση HexUtils είναι μια βοηθητική κλάση που παρέχει μεθόδους για τη μετατροπή δεδομένων σε δεκαεξαδικές αναπαραστάσεις χαρακτήρων και την εκτέλεση σχετικών λειτουργιών, όπως η δημιουργία hex dumps. Περιλαμβάνει συναρτήσεις για τη μετατροπή bytes και ακεραίων στις δεκαεξαδικές αναπαραστάσεις τους, τη δημιουργία hex dumps από πίνακες byte και τη μετατροπή πινάκων byte σε χαρακτήρες ASCII.

IPv4Filter

Αυτή η κλάση είναι μια υλοποίηση ενός φίλτρου IPv4 που επιτρέπει ή αρνείται συνδέσεις με βάση την προστασία από πλημμύρες (flood protection) για συγκεκριμένες διευθύνσεις IP.

Rnd

Rnd που παρέχει λειτουργικότητα παραγωγής τυχαίων αριθμών. Προσφέρει διαφορετικούς τύπους γεννητριών τυχαίων αριθμών με βάση τον καθορισμένο RandomType.

Οι διαθέσιμοι τύποι είναι:

  • SECURE: Χρησιμοποιεί SecureRandom για καλύτερη ποιότητα τυχαιότητας.
  • UNSECURE_ATOMIC: Χρησιμοποιεί java.util.Random για μέση ποιότητα τυχαιότητας.
  • UNSECURE_THREAD_LOCAL: Χρησιμοποιεί ThreadLocalRandom για ταχύτητα παράλληλης πρόσβασης. Κάθε νήμα (thread) έχει τη δική του τυχαία παρουσία (instance).
  • UNSECURE_VOLATILE: Χρησιμοποιεί NonAtomicRandom για ταχύτερη ταχύτητα παράλληλης πρόσβασης. Μπορεί να δημιουργήσει τον ίδιο σπόρο (seed) για δύο νήματα.

Util

Η κλάση περιέχει αρκετές στατικές μεθόδους που προσφέρουν διαφορετικές λειτουργικότητες.

Εδώ είναι μια περίληψη των μεθόδων που παρέχονται από την κλάση Util:

  • isInternalHostname(String host): Αυτή η μέθοδος ελέγχει εάν ένα όνομα host είναι εσωτερικό επαληθεύοντας εάν είναι διεύθυνση site-local ή διεύθυνση loopback.
  • printData(byte[] data, int len): Αυτή η μέθοδος δημιουργεί μια δεκαεξαδική αναπαράσταση ενός πίνακα byte. Παίρνει τον πίνακα byte και το μήκος των δεδομένων προς αναπαράσταση και επιστρέφει τη δεκαεξαδική αναπαράσταση ως string.
  • printData(byte[] data): Αυτή η μέθοδος είναι μια συντομογραφία για την printData(byte[] data, int len) και εκτυπώνει ολόκληρο τον πίνακα byte σε δεκαεξαδική μορφή.
  • printData(ByteBuffer buf): Αυτή η μέθοδος αναπαριστά τα υπόλοιπα bytes ενός ByteBuffer ως δεκαεξαδικό string.
  • generateHex(int size): Αυτή η μέθοδος παράγει μια τυχαία ακολουθία bytes του καθορισμένου μεγέθους και την επιστρέφει ως πίνακα byte.
  • getStackTrace(Throwable t): Αυτή η μέθοδος παίρνει ένα αντικείμενο Throwable και επιστρέφει το stack trace του ως string.
  • replaceIllegalCharacters(String str): Αυτή η μέθοδος αντικαθιστά τους περισσότερους μη έγκυρους χαρακτήρες σε ένα string με έναν χαρακτήρα κάτω παύλας.
  • isValidFileName(String name): Αυτή η μέθοδος επαληθεύει εάν ένα όνομα αρχείου είναι έγκυρο δημιουργώντας ένα αντικείμενο File με το δοσμένο όνομα και ελέγχοντας εάν μπορεί να ανακτήσει την κανονική διαδρομή του χωρίς να πετάξει εξαίρεση (exception).
  • splitWords(String input): Αυτή η μέθοδος χωρίζει λέξεις σε ένα string εισάγοντας ένα κενό μεταξύ ενός πεζού γράμματος που ακολουθείται από ένα κεφαλαίο γράμμα.
  • getNextClosestDateTime(DayOfWeek[] daysOfWeek, int hour, int min): Αυτή η μέθοδος υπολογίζει την επόμενη ή την ίδια πλησιέστερη ημερομηνία από τις καθορισμένες ημέρες της εβδομάδας στην καθορισμένη ώρα και λεπτό.
  • getNextClosestDateTime(List<DayOfWeek> daysOfWeek, int hour, int min): Αυτή είναι μια υπερφορτωμένη (overloaded) έκδοση της προηγούμενης μεθόδου που δέχεται μια λίστα αντικειμένων DayOfWeek αντί για έναν πίνακα.
  • mapToFunction(Map<K, V> map): Αυτή η μέθοδος μετατρέπει έναν χάρτη (map) σε μια συνάρτηση, όπου η συνάρτηση επιστρέφει την τιμή που σχετίζεται με ένα δεδομένο κλειδί στο χάρτη.
  • parseArg(String[] args, String arg, boolean hasArgValue): Αυτή η μέθοδος αναλύει (parses) ένα δεδομένο όρισμα από τα ορίσματα του προγράμματος Java. Μπορεί να ανακτήσει είτε το ίδιο το όρισμα είτε την τιμή του εάν καθορίζεται.
  • randomPassword(int length): Αυτή η μέθοδος παράγει έναν τυχαίο κωδικό πρόσβασης καθορισμένου μήκους. Ο κωδικός πρόσβασης περιέχει έναν συνδυασμό πεζών χαρακτήρων, κεφαλαίων χαρακτήρων και ψηφίων.