Discord

  • Es freut uns dass du in unser Minecraft Forum gefunden hast. Hier kannst du mit über 130.000 Minecraft Fans über Minecraft diskutieren, Fragen stellen und anderen helfen. In diesem Minecraft Forum kannst du auch nach Teammitgliedern, Administratoren, Moderatoren , Supporter oder Sponsoren suchen. Gerne kannst du im Offtopic Bereich unseres Minecraft Forums auch über nicht Minecraft spezifische Themen reden. Wir hoffen dir gefällt es in unserem Minecraft Forum!

PlugIn Programm Netty Channel Speicher

flowless

Minecrafter
Mitglied seit
12 Januar 2020
Beiträge
14
Hallo liebe Community!

Ich arbeite zurzeit an einem Multi-Channel system in Netty, bestehend aus einem Server und z.b 2+ Clients.
Mein Derzeitiges Ziel ist es, einen eingehenden Channel zu speichern, wenn er noch nicht vorhanden ist und dieses Channel mit einer Kennung zu versehen, bei mir ein String. Den genauen Datentypen den ich dafür benötige weiß ich nicht, ich habe es bereits mit einer map versucht, aber ohne erfolg.
Vorstellen kann ich mir jedoch folgendes:

Code:
private Map<String, Channel> channels = new Map<>();
Am ende wäre ich gerne in der Lage über z.b

Code:
private void sendMessage(String message, String channel) {
    channels.get(channel).write(message);
}
eine Nachricht an den Jeweiligen Channel zu senden.
Mittlerweile gehen mir die Ideen aus, nachdem ich zich Foren durchsucht habe, jedoch ohne einen für mich Verwertbaren erfolg, bitte um Hilfe!
 
Zuletzt bearbeitet:

flowless

Minecrafter
Mitglied seit
12 Januar 2020
Beiträge
14
Richtig, wir reden über "io.netty.channel"bzw dein Link ist zutreffend. bei mir hakt es an einer exception die bei jeder methode kommt, wenn ich versuche einen ctx oder einen channel nach dem speichern aufzurufen und was darüber zu senden.
 

flowless

Minecrafter
Mitglied seit
12 Januar 2020
Beiträge
14
Handler (als primitives Beispiel)

Code:
@ChannelHandler.Sharable
public class ServerHandler extends ChannelInboundHandlerAdapter {

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) {
        ByteBuf in = (ByteBuf) msg;
        System.out.println("Server received: " + in.toString(CharsetUtil.UTF_8));
        ChannelCache.mapChannels.put("Bungee", ctx.channel());
        System.out.println(ChannelCache.mapChannels.size());

        ChannelCache.sendMessage("Hallo client", "Bungee");

    }
}
ChannelCache

Code:
public static Map<String, Channel> mapChannels = new HashMap<>();

public static void sendMessage(String message, String Channel) {
    mapChannels.get(mapChannels).writeAndFlush(message);
}
exception beim senden der Nachricht

Code:
java.lang.NullPointerException
    at de.plorux.cloud.sockets.ChannelCache.sendMessage(ChannelCache.java:14)
    at de.plorux.cloud.sockets.ServerHandler.channelRead(ServerHandler.java:18)
    at io.netty.channel.DefaultChannelHandlerContext.invokeChannelRead(DefaultChannelHandlerContext.java:368)
    at io.netty.channel.DefaultChannelHandlerContext.fireChannelRead(DefaultChannelHandlerContext.java:353)
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:780)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:100)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:497)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:465)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:359)
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:101)
    at java.lang.Thread.run(Thread.java:748)
Ich weiß das ein Nullpointer kommt, aber nach einem debug habe ich gesehen das die size der map 1 entspricht nachdem ich den channel eingefügt habe
 

flowless

Minecrafter
Mitglied seit
12 Januar 2020
Beiträge
14
Oh da ist mir ein Fehler unterlaufen, dennoch wird beim übergeben des channels ohne fehler keine nachricht gesendet
 

Cabraca

Minecrafter
Mitglied seit
2 Januar 2020
Beiträge
29
HashMap ist nicht ThreadSafe. Nutz da bitte irgendwas, was ThreadSafe ist ... ConcurrentHashMap oder so.
Die NullPointerException kommt, weil du in deiner ChannelCache.sendMessage Methode nicht überprüfst ob der Key überhaupt existiert.
get(Objectkey)
Returns the value to which the specified key is mapped, or null if this map contains no mapping for the key.
Vielleicht solltest du deine Datenhaltung nochmal überdenken. Eine Trennung zwischen Datentransport und Logik wär sinnvoll. Und dann am besten noch alles ThreadSafe.
 

flowless

Minecrafter
Mitglied seit
12 Januar 2020
Beiträge
14
Habe deine ConcurrentHashMap nun mit einbezogen, nur was bring es mit abzufragen ob der key existiert, wenn er vorhanden ist? Das werde ich mit hineinnehmen, aber ist bei meiner Methode zum testen nutzlos, und hilft mir nicht weiter. Mein Ziel ist es ja jetzt das eine Nachricht gesendet wird.
 

flowless

Minecrafter
Mitglied seit
12 Januar 2020
Beiträge
14
Nein, er existiert mit dem dazugehörigem Value (channel), das ist mein eigentliches Problem am Ende, das keine Nachricht gesendet wird.
 

LapisMC

Schafhirte
Osterei Experte
Mitglied seit
29 März 2014
Beiträge
143
Alter
21
Minecraft
LapisMC
@flowless
Woran erkennst du denn, dass keine Nachricht gesendet wird? Wenn irgendetwas nicht funktioniert hat, müsste das von Channel#writeAndFlush() zurückgegebene ChannelFuture-Objekt einen Fehler enthalten. Du kannst also einen Listener darauf registrieren und dir dann mit ChannelFuture#cause() die Exception holen - die wird natürlich nie von writeAndFlush() direkt geworfen, da es sich um eine asynchrone Operation handelt. Mehr dazu steht im entsprechenden Javadoc.

Der Tipp von @Cabraca ist eher für die Zukunft wichtig. Im Laufe der weiteren Arbeit an deinem Projekt verhinderst du so viele weitere potenzielle NPEs. Es gibt neben einem Tippfehler noch andere Gründe, aus denen ein Eintrag in der Map unerwartet nicht (mehr) existieren könnte.
 

flowless

Minecrafter
Mitglied seit
12 Januar 2020
Beiträge
14
Erkenne ich daran, dass in meinem Client keine Nachricht eingeht >

Code:
@Override
    public void channelRead0(ChannelHandlerContext ctx, ByteBuf in) {
        String incoming = in.toString(CharsetUtil.UTF_8);
        System.out.println("Packet Empfangen: " + incoming);

    }
wenn ich ohne den map-channel eine nachricht zurückgesendet habe hat es Funktioniert, mit meiner aktuellen Vorstellung aber ebend nicht.
 

Cabraca

Minecrafter
Mitglied seit
2 Januar 2020
Beiträge
29
Nein, er existiert mit dem dazugehörigem Value (channel
Na wenn da ne NPE fliegt existiert der Key nicht. Da kannst du dich auch auf den Kopfstellen und mit den Beinen wackeln. Debug da doch mal durch und guck was im speicher passiert.
Wenn irgendetwas nicht funktioniert hat, müsste das von Channel#writeAndFlush() zurückgegebene ChannelFuture-Objekt einen Fehler enthalten.
An den Punkt kommt er ja garnicht, weil er von der Map "null" zurück bekommt.
 

LapisMC

Schafhirte
Osterei Experte
Mitglied seit
29 März 2014
Beiträge
143
Alter
21
Minecraft
LapisMC
An den Punkt kommt er ja garnicht, weil er von der Map "null" zurück bekommt.
Wenn ich nichts falsch verstanden habe, ist dieses Problem mittlerweile gelöst, aber es gibt noch ein anderes:
dennoch wird beim übergeben des channels ohne fehler keine nachricht gesendet
----
Erkenne ich daran, dass in meinem Client keine Nachricht eingeht
Wie gesagt, dann solltest du einfach den Zustand des ChannelFutures überprüfen. Wenn beim Senden ein Fehler aufgetreten ist, findest du ihn so heraus.
 

flowless

Minecrafter
Mitglied seit
12 Januar 2020
Beiträge
14
Nun Funktioniert es, an meiner Speichermethode lag es in diesem sinne anscheinend nicht, eher an der art wie ich es sende, folgendes hatte ich ja Probiert:

Code:
mapChannels.get(channel).writeAndFlush(message);
jetzt mit folgender Änderung geht es:

Code:
mapChannels.get(channel).writeAndFlush(Unpooled.copiedBuffer(message, CharsetUtil.UTF_8));
 

❤️可愛いちゃん️❤️

Threadripper
Osterei Experte
Mitglied seit
19 Mai 2014
Beiträge
1.308
Alter
3
Gibt es einen konkreten Grund weshalb du gerade Netty nutzen willst? Netty eignet sich zwar extrem gut für Serveranwendungen mit hoher Clientdichte und Datendurchsatz, aber da du keine Ahnung von Multithreading hast, kann ich kaum glauben, dass du das wirklich brauchst. Zumal Netty voraussetzt, das man solide Erfahrungen mit Multithreading und Networking hat.

Mit anderen Worten: Was mit anderen Frameworks ein kleiner Unfall ist, wird in Netty zur totalen Katastrophe.
 

flowless

Minecrafter
Mitglied seit
12 Januar 2020
Beiträge
14
Ja, nämlich da ich zurzeit an einer Multi-Client Anwendung arbeite zum Datenaustausch, möchte mich ein wenig herantasten.
Netty erschien mir die einzige für mich Umsetzbare Lösung zu sein.
 

flowless

Minecrafter
Mitglied seit
12 Januar 2020
Beiträge
14
Moinsen, bin nochmal da. Habe nachdem ich es getestet habe den Client ein BungeeCord plugin integriert, welches beim ausführen eines Befehles ein Argument an den Server übergibt. Problem ist das beim Start des Plugins und beim Verbindungsversuch immer kam:
Conntection refused /ip : port
 
Zuletzt bearbeitet:
Oben