NIO Problem beim speziellen Behandeln von einzelnen Benutzern

Nightmares

Aktives Mitglied
Hallo, ich habe folgendes Problem mit NIO:

Ich möchte gerne für jeden Client der zum Server eine Verbindung hat ein Referenz Objekt haben, in der Form von:
Java:
Class Tracker {
HastSet inQuery; // speichert alle Nachrichten die vom Client gelesen wurden
HastSet outQuery; // speichert alle Nachrichten die noch an den Client 
// gesendet werden sollen
}
Davon möchte ich dann später zum Beispiel eine Liste haben in der ich folgende Referenzen habe:

Connectionid is einfach nur eine zahl die benutzt werden kann um eine verbindung zu identifizieren und soll später in Form von Username->UserID->ConnectionID->TrackerObjekt umgewandelt werden um an die in-/outQuerys zu gelangen…
Java:
// connectionid zu Tracker Objekt
HastMap<Integer, Tracker> userconnections;
Dies dient dazu, dass ich später einfach mit connectionsIds arbeiten möchte und dann der outQuery ein neues Objekt hinzufügen möchte und dass geht dann an den Client. Oder durch WorkerThreads die inQuery lese und die Nachrichten verarbeite / darauf regiere.
Das hat mehrere Vorteile: Ich brauche nur in diese querys schreiben, da nach kann der Worker der die Server Logik erledigt den Rest vergessen. Außerdem: keine Sync Probleme… was nicht in der OutQuery ist kann nicht geschrieben werden, es ist auch egal in welche Reihenfolge Daten ankommen.

Ich habe bis jetzt nur direkt auf Nachrichten des Clients antworten können…
Und meine Lösung ist die einzige von der Idee her die mir bis jetzt eingefallen ist um speziellen Nutzern auch Daten zu schicken wenn sie gerade nichts Nachfragen d.h. Ohne konkrete Anfrage auf die Daten…
Hat da jemand vielleicht eine Idee zu? Mir geht es hier nur darum eine solche Verknüpfung zu erzeugen… Wie schicke ich in NIO von außerhalb an einen speziellen Client? Ich hatte zuerst einmal die Idee die SelectionKey’s zu verknüpfen das hat aber nicht hin gehauen…

Best regards
Nightmares
 

Nightmares

Aktives Mitglied
Ich habe mitlerweile eine Idee wie ich das realisiere..

wenn der key.isWriteable() ist das nächste outbound element holen und senden
wenn der key.isReadable() ist das lesen und in die inbound schreiben

nur wie verknüpfte ich die? Kann ich einfach das SelectionKey objekt als Referenz in eine HashMap schreiben und dazu nen Identifier oder ändert der sich evtl...?!

Bin im moment wirklich ratlos...
 

Kr0e

Gesperrter Benutzer
Warum benutzt du nicht ein NIO-Framework ? Ich bin eigentlich derjenige, der sagt "Hey, man sollte wissen, was unten drunter geschieht", aber du wirkst so, als ob es dir mehr ums Resultat ginge... Das was du da vor hast, könnte ne Weile dauern und selbst dann ist es (nichts gegen dich, aber es kommt einfahc total häufig bei NIO vor ;)) voller bottlenecks.. Ich lege dir wirklich Netty oder Mina ans Herz, die Einarbeitung dauert vlt. ein paar Tage bis du alles komplett kannst, aber dann kannst du ne Menge... Vertrau mir in dem Punkt... Mit NIO alles selbst amchen und dann auch noch was performantes hinkriegen ist ein großes Vorhaben und da verlässt einen nach ein paar Wochen vlt. shcnell die Lust ;) Die Frameworks mit NIO bieten dir den ganzen tollen Schnickschnack für massiven Netzwerkgebrauch..

Gruß,
Chris
 

Nightmares

Aktives Mitglied
Danke für den Tipp... aber ich will keines dieser Frameworks nutzen... Mir gehts um beides: Resultate ABER auch das Verständniss... Ich programmier das Projekt nicht für Geld sondern weil ich es als Herrausforderung sehe und Möglichkeit zu lernen. Sonst sitze ich im moment nur im Unterricht rum (Oberstufe is langweilig... unser Lehrer kann gar nichts...) bzw nicht im Moment sondern während der Schulzeit (im moment sind ja Ferien)

Außerdem habe ich gerade eben mein Primär Problem gelöst: Wie ich die Unterscheidung mache...

Java:
// in diese trägt sich der key by isAcceptable() ein
HashMap<Integer, SelectionKey> cidToKey;
HashMap<SelectionKey, Integer> keyToCid;
HashMap<Integer, LinkedList<String>> cidToWriteQueue;
HashMap<Integer, LinkedList<String>> cidToReadQueue;
Object synchronizedLock;
int connectionIdCounter;

public void registerNewConnection(SelectionKey key) {
	synchronized (this.synchronizedLock) {
		this.connectionIdCounter++;
		int cid = this.connectionIdCounter;
		this.cidToKey.put(cid, key);
		this.keyToCid.put(key, cid);
		this.cidToWriteQueue.put(cid, new LinkedList<String>());
		this.cidToReadQueue.put(cid, new LinkedList<String>());
	}
}

/* und in isReadable() schreibt er dann die neue Nachricht in die readQueue und bei isWriteable() prüft er ob ein objekt in der writeQueue ist und falls ja schreibt das. */

Funktioniert soweit, alles andere is eine Frage der Zeit und Ausarbeitung... sobald mal nen Grundgerüst steht. Sobald ich mit einer sauberen Version fertig bin poste ich hier für alle interessierten den Code.
 

Nightmares

Aktives Mitglied
Nachtrag: Dämliche Idee...

cid für die Auflösung is idiotisch:
direkt den key...

Java:
	HashMap<Integer, SelectionKey> cidToKey;
	HashMap<SelectionKey, Integer> keyToCid;
	HashMap<SelectionKey, LinkedList<String>> keyToWriteQueue;
	HashMap<SelectionKey, LinkedList<String>> keyToReadQueue;
	Object synchronizedLock;

	int connectionIdCounter;

	public Mapping() {
		this.connectionIdCounter = 0;
		this.cidToKey = new HashMap<Integer, SelectionKey>();
		this.keyToCid = new HashMap<SelectionKey, Integer>();
		this.keyToWriteQueue = new HashMap<SelectionKey, LinkedList<String>>();
		this.keyToReadQueue = new HashMap<SelectionKey, LinkedList<String>>();
		this.synchronizedLock = new Object();
	}

	public void registerNewConnection(SelectionKey key) {
		synchronized (this.synchronizedLock) {
			this.connectionIdCounter++;
			int cid = this.connectionIdCounter;
			this.cidToKey.put(cid, key);
			this.keyToCid.put(key, cid);
			this.keyToWriteQueue.put(key, new LinkedList<String>());
			this.keyToReadQueue.put(key, new LinkedList<String>());
		}
	}
 

Nightmares

Aktives Mitglied
Das erste Nein, die anderen 2 Ja und dannach arbeitet ich auch. Und für meinen Anwendungszweck gibt es keinen Weg um eine "Auflösung" zwischdrinen und output/input queue rum... Weils am Ende auch ein bisschen um Performence geht... da nehme ich etwas mehr Arbeit von Hand und beim Denkansatz erstmal in kauf... Und es Funktioniert bis jetzt Einwandfrei nach der Idee...
 

Kr0e

Gesperrter Benutzer
Hallo!

Also gut, wenn du es wirklich selbst probieren willst, würde ich dir folgende Tipps vorschlagen:

Nimm Netty3 oder Mina wenigstens zur hilfe bzw. schau dir bestimmte Stellen an. Das kann helfen, du musst ja
das Rad nicht zum x-ten Mal erfinden. Z.B. gibt es ein paar Sachen, die sich als performant erwiesen haben und an
denen du nicht rütteln solltest...

- Das Behandeln der Channels also z.B. isConnectable, isWritable, isReadable wird in einem thread erledigt!

- Wenn ein Thread lesbar/schreibbar ist, dann wird in einem ANDEREN Thread gelesen/geschrieben, damit die anderen
Verbindungen nich evt. unter einer lahmen Verbindung leiden müssen (Wichtig: Verwende so viele threads wie es
physikalische Prozessoren gibt, alles andere macht logischerweise keinen Sinn.
Runtime.getRuntime().availableProcessors() .. oder so ähnlich)

- Wichtig: Innerhalb einer Verbindung solltest du keine konkurrierenden Events auslösen: Also wenn von einem Channel gelesen
werden kann und dieser auch gleichzeitig beschreibbar ist, dann benutze eine Warteschlange... Unterschiedliche Channels
können natürlich konkurrierend ausgeführt werden.

- Jeder Channel hat ein Maximum an Daten, dass er pro Schreibvorgang schreiben darf, damit andere Channels nicht benachteiligt
werden.

- Erstelle dir future- oder event-systeme, NIO ohne Asynchronität ist einfahc nur sinnlos... Mina und Netty bieten dir hier super
Referenzimplementierungen!

- Sorge für Sicherheit und Robustheit! Überlege dir, wo Exceptions auftreten können und fang sie so, dass bei der kleinsten
Exception nicht glecih der ganze Server abschmiert.

Es gibt noch sehhhr viel mehr wichtige und unerlässliche Tipps: ByteBuffer sind vollkommen unflexibel für dynamische Protokolle!
Auch hier bieten Netty3 und Mina super Ansätze!

Wenn du noch weitere Fragen hast, immer her damit!

Gruß,

Chris
 

Nightmares

Aktives Mitglied
Danke für die Tipps, dass ist schonmal was. Bin jetzt endlich mit meinem Auto aus der Werkstatt zurück... Wieder zurück an Java, wirst sicher noch von mir hören

Wurde hier auch auf ein sehr gutes Beispiel/Doku verwiesen die ich jetzt zu verstehen versuche und dann selber für meine Bedürfnisse programmieren werde. :reflect:
 

Kr0e

Gesperrter Benutzer
Alles klar, dennoch würde ich vermutlich auf ein bereits existierendes Produkt zurückgreifen, man kann auch an Hand dieser Frameworks den inneren Aufbau gut verstehen und wissen, was genau da geschieht... aber dann doch alles neu zu machen ist einfach für eine Person viel zu viel Arbeit ... Ist gut verglecihbar mit einer 3d Engine wie jME3 oder Ardor3D.. Ansich ist der Aufbau total simpel und jeder der OpenGL kann, könnte sowas auch selbst hinkriegen aber nicht in angemessener Zeit ;) Es spricht wirklcih nix gegen die Verwendung solcher Produkte, gerade weil Mina und Netty sogar LGPL sind und von daher auch in kommerziellen Produkten verwendet werden dürfen ohne iwelche Richtlinien zu beachten ;)

Gruß,

Chris
 

Nightmares

Aktives Mitglied
So bin wieder da. Soweit ich geguckt habe sind Mina/Netty unter Apache Lizenz. Von LGPL steht da nichts. Außerdem habe ich meine Eigene Lösung jetzt sauber ans Laufen gekriegt (unter Betrachtung des Source Codes von bestehenden Lösungen).
 
Zuletzt bearbeitet:

Kr0e

Gesperrter Benutzer
Hallo!

Na das is doch super, ich bin eignetlich auch der Fan von selbstgemachten Sachen...

Nochmal zu den Lizenzen:

Stimmt, die sind nicht LGPL, aber dennoch haben die diese Copy-left-Klausel dabei wodurch die sich im Endeffekt relativ aehnlich sind.

Frohe Ostern :D

Chris
 

Nightmares

Aktives Mitglied
Gibt es hier im Forum eigentlich sowas wie eine "Tutorial" Sektion? Falls ja würde ich da demnächst eine sehr ausführliche für jeden leicht zu verstehende Version eines JAVA-NIO Tutorials schreiben zusammen mit einer großen Liste an FAQ's(Frequently Asked Questions) die mir in den Sinn kamen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
R Problem beim Programmieren eines Chatprogramms Netzwerkprogrammierung 5
S Umstellung AS400 auf Postgre - Problem beim Arbeiten mit Metadaten Netzwerkprogrammierung 2
G Socket NIO2 Problem mit AsynchronousSocketChannel beim Schließen Netzwerkprogrammierung 3
D RMI Problem beim shutdown von verteilter CORBA-Anwendung Netzwerkprogrammierung 6
M Problem beim Datenempfang Netzwerkprogrammierung 2
E HTTP Problem beim Auslesen von Websiten Netzwerkprogrammierung 6
Y Problem mit ObjectInputStream beim lesen vom Socket Netzwerkprogrammierung 10
P HTTP Problem beim Download von einer Datei Netzwerkprogrammierung 4
I Problem beim empfangen von Daten (Zahlen) Netzwerkprogrammierung 7
Rontu Problem beim Übertragen einer Datei Netzwerkprogrammierung 9
J Problem beim Senden von File Netzwerkprogrammierung 4
V Problem beim Senden von Dateien Netzwerkprogrammierung 4
P problem beim schließen eines Streams Netzwerkprogrammierung 6
C Session Problem beim Zugriff auf Webseiten Netzwerkprogrammierung 3
I Apache http-client: Problem beim Proxyaufruf Netzwerkprogrammierung 2
C RMI: Problem beim Aufruf einer Methode. Falsch gecastet? Netzwerkprogrammierung 8
D Problem beim holen einer PHP-Seite via HttpClient Netzwerkprogrammierung 19
J Problem beim versenden von eigenen Objekten über RMI Netzwerkprogrammierung 2
R Problem beim Senden von Emails (Javamail) Netzwerkprogrammierung 2
M problem beim schicken von XML-DAtenpacketen via TCP Netzwerkprogrammierung 3
D Performance Problem beim File senden, empfangen Netzwerkprogrammierung 4
I Socket Problem mit den WebSocket Antworten der Discord API Netzwerkprogrammierung 0
K Java Websocketserver Problem | Android to Pi Netzwerkprogrammierung 1
C RMI Produzent-Verbraucher-Problem - Code review Netzwerkprogrammierung 12
B Socket Bilder verschicken via Sockets. Heap-Problem. Netzwerkprogrammierung 2
S Problem bei dem Bluetoothverbindungsaufbau Netzwerkprogrammierung 2
G Server-Client IO Problem Netzwerkprogrammierung 6
M Netty - TCP Problem Netzwerkprogrammierung 4
L Socket Problem mit Server Netzwerkprogrammierung 1
J Chat Server starten über GUI problem Netzwerkprogrammierung 4
M Problem bei Socket (MultiplayerSpiel) Netzwerkprogrammierung 4
M Socket CDI, Websocket reference Problem ! Netzwerkprogrammierung 2
Shams Problem mit Eventbus in Verbindung mit Server Netzwerkprogrammierung 0
G apache httpClient Problem. Netzwerkprogrammierung 5
H Problem mit ObjectStreams Netzwerkprogrammierung 3
D Socket BufferedWriter/Reader Problem Netzwerkprogrammierung 1
Maxim6394 Problem mit Socks5 Implementierung Netzwerkprogrammierung 0
C Handle Connection Problem Netzwerkprogrammierung 3
E HttpUrlConnection Cookie Problem Netzwerkprogrammierung 0
X Problem mit vielen Bytes über Socket Netzwerkprogrammierung 23
O 4Gewinnt Multiplayer - Netzwerk Problem (TCP) Netzwerkprogrammierung 1
A Socket Socket-Problem - Object wird nicht übertragen Netzwerkprogrammierung 3
E einfaches Problem: Session-Handling bei Servlets Netzwerkprogrammierung 5
G Problem mit einem FileWatcher Netzwerkprogrammierung 7
T Socket Server starten Thread Problem Netzwerkprogrammierung 12
B Client/Server Connection Problem Netzwerkprogrammierung 2
G Problem mit STATIC-Verständnis Netzwerkprogrammierung 8
J Facelets Include Rendered Problem Netzwerkprogrammierung 2
J Socket Problem mit C++/Java Netzwerkprogrammierung 20
P Problem mit Datagram-Sockets Netzwerkprogrammierung 2
G Cookie Verwaltungs Problem nach Login auf InetSeite (Wo utma-Cookie?) Netzwerkprogrammierung 18
C Socket Problem mit ObjectInput/OutputSream Netzwerkprogrammierung 7
B Socket Problem mit Netzwerkchat Netzwerkprogrammierung 21
Maxim6394 ipv6 Problem Netzwerkprogrammierung 2
Maxim6394 Proxyserver Performance Problem Netzwerkprogrammierung 11
M Problem Client - Server Sockets: .ready() wird nie true! Netzwerkprogrammierung 6
C Socket Problem mit ObjectInput/OutputSream Netzwerkprogrammierung 5
B RMI und Problem mit rmic-Tool Netzwerkprogrammierung 3
C FTP storeFileStream Problem Netzwerkprogrammierung 3
N Problem über http eine Datei zu senden Netzwerkprogrammierung 4
D JavaMail - Mailsabrufen Problem (imap) Netzwerkprogrammierung 12
J HTTP Übersetzung yahoo babelfish - Zeichensatz-Problem Netzwerkprogrammierung 6
D Apache CXF, JAX-WS Problem bei Arrays - einfacher Server Netzwerkprogrammierung 2
X Problem mit Server-Client-Kommunikation Netzwerkprogrammierung 14
M Problem mit Socket-Verbindung Netzwerkprogrammierung 2
D Thread problem Netzwerkprogrammierung 3
T Servlets JSP: Tomcat Problem Netzwerkprogrammierung 4
K Client - Server Problem Netzwerkprogrammierung 16
T RMI Problem Client-Server Netzwerkprogrammierung 2
P RMI Stub Problem Netzwerkprogrammierung 3
D Socket UDP Übertragungs Problem Netzwerkprogrammierung 7
I HTTP Post aus html in Java einlesen - Problem Netzwerkprogrammierung 2
I HTTP Post aus html in Java einlesen - Problem Netzwerkprogrammierung 6
D Problem mit ObjectInputStreams Netzwerkprogrammierung 10
D Socket Problem mit InputStreamReader Netzwerkprogrammierung 3
N CRC32 CheckSum Problem bei UDP Netzwerkprogrammierung 2
V Java Mail Api - IMAP Problem Netzwerkprogrammierung 6
P RMI Problem Netzwerkprogrammierung 4
I Problem bei Outputstreamerzeugung in anderer Klasse als Socket Netzwerkprogrammierung 5
S Socket Problem mit Objektübertragung Netzwerkprogrammierung 16
Shoox Reader / Writer Problem Netzwerkprogrammierung 2
S Problem mit 2 Serversockets unter Win XP Netzwerkprogrammierung 7
P Socket Problem mit Netzwerkverbindung über TCP Netzwerkprogrammierung 12
M RMI - Connection Problem Netzwerkprogrammierung 7
J Socket Client - Server Problem Netzwerkprogrammierung 4
M Socket Chat-Client-Problem Netzwerkprogrammierung 8
D Client Server Problem, Methode readline() löst SocketException "Connection reset" aus Netzwerkprogrammierung 8
T Problem bei Findung der richtigen Architektur Netzwerkprogrammierung 3
AlexSpritze Authentication Problem bei WebServices Netzwerkprogrammierung 4
J Socket Problem -Proxies Netzwerkprogrammierung 2
R HTTP Problem bei Authentifizierung über (Http)UrlConnection Netzwerkprogrammierung 2
F Konzept Problem Netzwerkprogrammierung 12
G NIO Sockets Architektur Problem Netzwerkprogrammierung 2
H Neues NIO problem nachricht an alle clients Netzwerkprogrammierung 3
J Client server problem Netzwerkprogrammierung 3
S Problem bzgl. Sockets / Server-Client-Struktur Netzwerkprogrammierung 3
W RMI Problem Netzwerkprogrammierung 4
M Problem mit Server Netzwerkprogrammierung 5
N Socket Java server c# client problem Netzwerkprogrammierung 7

Ähnliche Java Themen

Neue Themen


Oben