• 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 Netty Channel Speicher

D

deleted223693

Guest
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 von einem Moderator:
D

deleted223693

Guest
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.
 
D

deleted223693

Guest
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
 
D

deleted223309

Guest
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.
 
D

deleted223693

Guest
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.
 
D

deleted223693

Guest
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.
 
D

deleted223309

Guest
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.
 
D

deleted223693

Guest
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));
 

Chrisliebär❤️

nur echt mit ❤️
Moderator
Registriert
19 Mai 2014
Beiträge
1.675
Diamanten
830
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.
 
D

deleted223693

Guest
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 von einem Moderator:
D

deleted223693

Guest
Beide laufen auf dem Selben Server, der Client in einem BungeeCord-Plugin, der Server als Anwendung (port 2005 bei beiden) und ich habe bei dem Client als Host "localhost" angegeben, die Adresse des Servers sowie 127.0.0.1 scheiterten ebenso.
 
Oben