Beiträge von ZargorNET

    Dein Problem besteht darin, dass du nicht ganz das Prinzip eines Streams verstehst.

    Laut der Exception versuchst du einen Int zu lesen.

    Code
    Caused by: java.lang.IndexOutOfBoundsException
    at io.netty.buffer.EmptyByteBuf.readInt(EmptyByteBuf.java:470)
    at de.f4ls3.netty.server.SimpleServer$1$3.decode(SimpleServer.java:60)

    Das Problem ist nur, dass du einmal den Debug Int liest und einmal dann zur Bestimmung der PacketID. Nur verschiebst du damit den Reader Index, sodass du einmal deine korrekte Packet ID liest (in deinem System.out.println()) und das nächste .readInt() liest dann aber schon ein Teil deines Payloads ist. Das führt dazu, dass alles bei dir verschoben ist und du absolut nicht weißt, was Packet ID ist, was length, was payload, da der Buffer verschoben ist.

    Wenn du also ein Packet schreibst (z.B.)

    Code
    buf.writeInt(packet.id);
    buf.writeShort(s.length);
    buf.writeString(s);
    buf.writeBool(true);

    musst du das in genau der gleichen Reihenfolge lesen!


    Also:

    Code
    buf.readInt();
    buf.readShort();
    buf.readString();
    buf.readBool();


    Auch brauchst du ein Ping/Pong Packet, dass du manuell alle x Sekunden sendest, damit die ReadTimeoutException nicht geworfen wird, denn die tritt auf, wenn du x Sekunden nichts mehr gelesen hast.


    Ich weiß nicht wie sehr das hilft, aber ich kann dir vielleicht empfehlen einen Blick auf mein Minecraft-Server Network Code zu werfen:

    https://github.com/RecubeNET/R…ality/Recube.Core/Network & https://github.com/RecubeNET/R…nality/Recube.Api/Network

    (basic-functionality branch, weil da atm ein Bugfix drinne ist, der noch nicht gemerged geworden ist)

    Es sollte jedoch deinem Code ähneln, da ich dort auch für jedes Packet eine Klasse habe etc.

    Also ich habe mal kurz eben darüber nachgedacht.

    Ich würde das so angehen:

    Beispiel CollectQuest:



    Ich hoffe, man versteht auf was ich hinaus will :D


    Und wenn du mehrere Quest-Steps hast, kannst du natürlich anonyme Funktionen nehmen, deine Liste mit QuestSteps oder schlicht einen Enum.

    Persönlich wäre ich der einfachheitshalber für den einfachen Enum (vor allem bei einfachen Quests).

    Gleich diese Domains zu kaufen, weil es rauskommt finde ich persönlich ziemlich "egoistisch". Man weiß nichtmal, ob Hytale eine Serversoftware rausbringt, ist durchaus möglich, dass Hytale ihre eigene Server bereitstellt z.B. wie bei Fortnite. Außerdem denk ich, dass sich das mit den Servern ziemlich langsam entwickelt, denn es ist SICHER NICHT Java, die haben ja schon ihren Grund warum sie Hytale nicht in Java schreiben... Und Sprachen wie C++(sind nur Vermutungen, habe keine Ahnung ob C++ zum programmieren verwendet wird oder doch irgendeine andere Sprachen - hier bieten sich Scriptsprachen wie Lua gut an) können wesentlich weniger die aus dieser Szene kommen als Java. Denn Java ist meines Erachtens "nur" eine simple Sprache.

    Man wird definitiv nicht in C++ seinen Server modden. Es wird vielleicht möglich sein, aber sie werden auch Scriptsprachen wie Lua, Python oder JavaScript unterstützen - und die können auf jeden Fall 100000 Mal mehr Leute als Java (und Java können schon viele! (C# zählt auch mit, da es ja viele Ähnlichkeiten gibt)). Und dank der leichten Script Sprachen, der Open-Source Serversoftware und den Tools zum Modellieren von 3D Models, werden innerhalb von kürzester Zeit Server kommen, auf den man Sachen machen kann, die man sich vorher im Minecraft nur erträumen konnte (bzw. Modpacks, die sind aber teilw. sehr buggy).
    Btw: Ich kenne wenig Programme (außer Treiber), die nur eine C-Schnitstelle bieten (*hust* Teamspeak (Ja gut, es gibt den C# Wrapper, aber der kam auch erst später hinzu) *hust*)

    Also ich glaube nicht, dass du einen Auth-Code in irgend einer Weiße hashen musst. Denn wenn dein Server gehackt wird, hilft dir dein hash auch nichts mehr^^

    Zum generieren des Passworts kannst du einen SecureRandom nehmen java.security.SecureRandom

    In Java vergleicht man Strings mit .equals.

    Und bitte nutze Inline-Ifs message = seconds != 1L ? TRUE :FALSE;

    Auch fragst du am besten ganz oben ein einziges mal ab, ob die message null oder "" ist und nicht in jedem Block.

    Sparst so viel Code.

    Rust (mal von gehört, aber mehr auch nicht)

    Rust ist eine sehr performante native Language. Sie läuft auf keiner VM, sondern macht sich Reference Counting, Move Semantics und Referenzen zum Vorteil.

    Sie ist noch ziemlich neu, wo durch es kaum Libraries gibt(klar es gibt ne Menge, aber viele sind davon nicht ausgereift).

    Auch macht sie ein ganz neuen Ansatz, sie ist wie C++ nur viel sicherer, in dem sie schon zur Compile Time permanent rum meckert.

    Jedoch durch das sicherere Design der Sprache, ist sie schwerer zu erlernen als C++.


    Also wenn man noch nie bspw. C++ gemacht hat, sollte man lieber erst mal die Finger von Rustlang lassen.

    Lieber dann erstmal Modern C++ mit Smart Pointern etc. lernen.

    Python (auch wenn die Geschichte mit dem Einrücken ohne gescheite IDE einfach nur ein Graus ist)

    Ich empfehle bei IDEs immer JetBrains Produkte. Also in diesem Fall PyCharm. Die PRO Version kostet zwar ne Menge Geld, jedoch gibt es auch die Community Version, die zwar weniger Features hat, aber trotzdem komplett ausreichen sollte. Und falls du noch Schüler/Student bist, kannst du ein Bild von deinem Schüler Ausweis dort hinschicken und bekommst so ein paar Tage später vollen Zugriff auf alle IDEs von JetBrains. Vorteil dabei: Die JetBrains IDEs sind alle gleich von den Keyboard Shortcuts, Aussehen, Bedienung etc.

    Habe das Problem mit IntelliJ auch.

    Ich habe dann einfach Git von der Console genutzt. Funktioniert gut und ist auch sehr leicht.

    In dem Fall wäre das git remote add origin wwddw@wdw.dw. Voraussetzung ist natürlich Git auf dem Rechner installiert zu haben.

    Wenn man es aber nicht mit der Console machen will, kann man auch gut SourceTree/Git Kraken nutzen.

    Ich weiß, dass es nicht wirklich zur Lösung beiträgt, trotzdem wollte ich schildern, wie ich das Problem umgangen bin.