NIO Sockets Architektur Problem

G

Gast2

Gast
Hi,

Ich habe in den letzten Tagen ein bisschen mit NIO Sockets rumgespielt und möchte gerne folgendes Client/Server Verhalten implementieren:

Workflow:

1. Client verbindet auf Server
2. Client sended Daten
3. Server parst Daten und berechnet Antwort
4. Server sended Antwort an Client
5. Client bleibt verbunden
6. Client sended erneut Daten, goto 2.

2. 3. und 4. sind zeitlich unbestimmbar, zwischen 1ms und timeout setting

1. bis 6. kann von x clients parallel auf einen Server aufgerufen werden.

Also 1000 Client senden kontinuierlich Daten and eine ServerInstanz der dann eine Antwort produziert. Aus performance Gründen muss der Channel/Socket offen bleiben damit der Client wenn er wieder Daten hat nicht neu connecten muss. Die Client sind nicht zwingen Java, kann auch Python, C oder was auch immer sein.

Der Server wird so angelegt
Java:
	public AfsSocketServer(String host, int port, String engineId) throws IOException {
		logger.info("Creating Socket on ",host+":",port);
		ServerSocketChannel serverChannel = ServerSocketChannel.open();
		ServerSocket ss = serverChannel.socket();
		ss.bind(new InetSocketAddress(host, port));
		serverChannel.configureBlocking(false);
		selector = Selector.open();
		serverChannel.register(selector, SelectionKey.OP_ACCEPT);
		setDaemon(true);
		serverRunning = true;
		this.port = port;
		this.host = host;
		this.engineId = engineId;
		start();
	}

Der folgende Code funktioniert, natürlich mit dem Nachteil das die Schleife während der Ausführung der Methoden (im Beispiel Code vereinfachte Mockups) zwischen Line 18 und 28 blockiert.
Java:
		while (serverRunning) {
			try {
				selector.select();
				Set<SelectionKey> keys = selector.selectedKeys();
				Iterator<SelectionKey> i = keys.iterator();

				while (i.hasNext()) {
					SelectionKey key = i.next();
					i.remove();
					
					if (key.isAcceptable()) {
						ServerSocketChannel serverChannel = (ServerSocketChannel) key.channel( );
						SocketChannel clientChannel = serverChannel.accept();
						clientChannel.configureBlocking(false);
						clientChannel.register(selector, SelectionKey.OP_READ);
						continue;
					}
					if (key.isReadable()) {
						SocketChannel client = (SocketChannel) key.channel();
						client.register(selector, SelectionKey.OP_READ);
						
						// step 2., 3. and 4.
						String message = readFromChannel();
						client.register(selector, SelectionKey.OP_WRITE);
						String response = processingMessage(message);
						
						ByteBuffer out = ByteBuffer.wrap(responseSocketString.getBytes("UTF8"));
						client.write(out);
						client.register(selector, SelectionKey.OP_READ);
						continue;
					}
					if (key.isWritable()) {
						// 
					}
				}

Um das Problem zu beheben dachte ich, ich würde einfach einen thread starten der das "Processing" macht, also im einfachsten Fall
Java:
					if (key.isReadable()) {
						SocketChannel client = (SocketChannel) key.channel();
						new ProcessingThread(client, selector).start();
						continue;
					}

Ich lasse jetzt extra mal ThreadPools, WorkerThreads etc raus. Der naive ProcessingThread würde also nur
Java:
					public void run(){
						client.register(selector, SelectionKey.OP_READ);
						
						// step 2., 3. and 4.
						String message = readFromChannel();
						client.register(selector, SelectionKey.OP_WRITE);
						String response = processingMessage(message);

						ByteBuffer out = ByteBuffer.wrap(responseSocketString.getBytes("UTF8"));
						client.write(out);
						client.register(selector, SelectionKey.OP_READ);
					}

Auch das funktioniert soweit.

Das Problem das ich habe ist das die Schleife das erstemal durchläuft und den client verbinded. Im zweiten Schleifendurchlauf startet brav ein Thread, ließt vom Stream und returned eine Antwort. Während der Thread rechnet läuft die Schleife weiter. Und in jedem Durchlauf wird eine neuer Thread gestartet...
Java:
					if (key.isReadable()) {
						logger.warn(key);
						SocketChannel client = (SocketChannel) key.channel();
						new ProcessingThread(client, selector).start();
						continue;
					}
2010-02-19 11:35:01,926 [Thread-0] WARN [TestSocketServer] - sun.nio.ch.SelectionKeyImpl@b8f8eb
2010-02-19 11:35:01,927 [Thread-0] WARN [TestSocketServer] - sun.nio.ch.SelectionKeyImpl@b8f8eb
[...]
2010-02-19 11:35:01,933 [Thread-0] WARN [TestSocketServer] - sun.nio.ch.SelectionKeyImpl@b8f8eb

Allerdings empfängt der Thread nur im ersten Durchlauf Daten. In den weiteren Druchläufen kommt nur null - was ja auch erwartet wird da der Client nur einmal sended.

Warum wird der "wartende" Client jedesmal wieder im selector als aktiv selektiert? Muss ich mir jetzt Keys die aktiv sind merken und die beim Thread sstarten ignorieren? das sieht mir irgendwie krumm aus:
Java:
					if (key.isReadable()) {
						logger.warn(key);
						if(!busyKeys.contains(key)){
						    SocketChannel client = (SocketChannel) key.channel();
						    new ProcessingThread(client, selector).start();
						}
						continue;
					}

Oder ist die ganze Architektur Idee falsch? Ich hab in Java NIO und Java Networking rumgelesen, aber so einen richtig guten Vorschlag hab ich da auch nicht gefunden. Irgendwelche Vorschläge/Tips - was mache ich falsch?
 
G

Gast2

Gast
Englisch ist kein Problem. Die Seite sieht gut aus. Werd ich mal durcharbeiten.

Danke...
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Jannn Socket Sockets an ein anderes Gerät weiterreichen? Netzwerkprogrammierung 8
JaXnPriVate Java HTTPS Server (Secure Sockets) Netzwerkprogrammierung 15
B Socket Bilder verschicken via Sockets. Heap-Problem. Netzwerkprogrammierung 2
E Socket Parameter über Sockets übergeben und auslesen ! Netzwerkprogrammierung 5
D Socket Verwirrung bei Sockets Netzwerkprogrammierung 1
E Mehrere Sockets Netzwerkprogrammierung 2
N Fragen zu Sockets Client Netzwerkprogrammierung 3
A Sockets Serialisierung Netzwerkprogrammierung 1
K Threads closen und Sockets schliessen Netzwerkprogrammierung 5
H Sockets oder HTTP- Methoden? Netzwerkprogrammierung 3
T Socket Bidirektionale Verbindung mit Sockets Netzwerkprogrammierung 8
P Problem mit Datagram-Sockets Netzwerkprogrammierung 2
C Socket Datagram-Sockets mit integrierter Message Queue? Netzwerkprogrammierung 2
M Problem Client - Server Sockets: .ready() wird nie true! Netzwerkprogrammierung 6
F Technologiewahl: Swing/RMI/Sockets Netzwerkprogrammierung 13
B Sockets, Threads & Plugins Netzwerkprogrammierung 7
T Verbindungsversuche über TCP Sockets von mehreren Threads führt zu Serverabsturz Netzwerkprogrammierung 2
D Mehrere Clients über Java-Sockets Netzwerkprogrammierung 13
F FTP Client mit Sockets - wann sagt der Server nichts mehr? Netzwerkprogrammierung 7
U Socket Abhören eines Sockets/Ports in extra Thread Netzwerkprogrammierung 8
M Socket Sockets Grundlage Netzwerkprogrammierung 25
I Socket HTTP Nachrichten über Sockets verschicken Netzwerkprogrammierung 2
D Socket Raw Sockets mit java.net.*? Bsp ICMP Netzwerkprogrammierung 7
H Komprimierte Sockets Netzwerkprogrammierung 4
V Verbindung zweier Rechner über das Internet mit Sockets Netzwerkprogrammierung 8
L Sockets übergeben Netzwerkprogrammierung 4
S Problem bzgl. Sockets / Server-Client-Struktur Netzwerkprogrammierung 3
B Socket Was muss man bei Sockets beachten? Netzwerkprogrammierung 10
N Socket Sockets und Events Netzwerkprogrammierung 11
A Programm umschreiben von Pipes auf Sockets Netzwerkprogrammierung 12
B Paralleler Dateitransfer: Ein Client - Mehrere Sockets? Wie connecten? Netzwerkprogrammierung 16
D RMI oder Sockets Netzwerkprogrammierung 4
P Sockets +Port Forwarding = Chaos Netzwerkprogrammierung 4
clupus Exception beim Schließen eines Sockets Netzwerkprogrammierung 6
Q Thread und Sockets... Netzwerkprogrammierung 2
G Sockets und HTTP: Ende des Datenempfangs erkennen Netzwerkprogrammierung 3
J Array oder Object über Sockets Netzwerkprogrammierung 8
O Sockets -- Einsieg Netzwerkprogrammierung 3
S Sockets und gzip Netzwerkprogrammierung 8
B Nachricht über Sockets kommt nicht an Netzwerkprogrammierung 8
data89 Sockets: ein alter Hut - für Euch - für mich nicht! Netzwerkprogrammierung 10
S Wiedereinmal Sockets ;-) Netzwerkprogrammierung 15
J Ascii / Unicode bei Sockets? Netzwerkprogrammierung 2
G Datagram-Sockets für UDP-Kommunikation Netzwerkprogrammierung 2
K "Ende eines Sockets" Netzwerkprogrammierung 9
A Sockets Netzwerkprogrammierung 10
feuervogel Sockets - Lokalen Port aber nicht IP bestimmen Netzwerkprogrammierung 3
C Einfacher Filedownload mit Sockets geht nicht für pdffiles Netzwerkprogrammierung 16
E Sockets, readLine() Netzwerkprogrammierung 7
M Sockets und InputStream Netzwerkprogrammierung 8
G Verbindung über Sockets Netzwerkprogrammierung 2
S zip-files über sockets übertragen Netzwerkprogrammierung 11
G immer wieder gleiche Sockets Netzwerkprogrammierung 2
V Suche Alternative zu Sockets Netzwerkprogrammierung 3
E Problem bei Sockets/InputStream über externe Klasse Netzwerkprogrammierung 5
A Datenverlust (zuviele Daten!) über Sockets Netzwerkprogrammierung 4
AlClemento Sockets -> BufferedReader Problem Netzwerkprogrammierung 2
F Problem mit Threads und Sockets Netzwerkprogrammierung 3
B Übertragung via Sockets Netzwerkprogrammierung 12
C Dateien über Sockets versenden? Netzwerkprogrammierung 10
T Sockets Verständnisfrage: abwechelnd lesen-schreiben Netzwerkprogrammierung 4
S Habe ein Problem mit Sockets -> Client Server Netzwerkprogrammierung 2
G Strings über Sockets senden Netzwerkprogrammierung 5
P Probleme mit einem Array aus Sockets Netzwerkprogrammierung 2
Y buch: Netwerprogrammierung und Sockets Netzwerkprogrammierung 2
B Eigenes Protokoll über Sockets verschicken Netzwerkprogrammierung 4
P Welche Art von Sockets für ein Spiel? Netzwerkprogrammierung 3
C Sockets über Internet Netzwerkprogrammierung 10
K Applet - Servlet Kommunikation ohne Sockets Netzwerkprogrammierung 5
S Objekte zwischen Client und Server über Sockets senden Netzwerkprogrammierung 2
Z chat: wann http und wann sockets verwenden? Netzwerkprogrammierung 11
D Java Sockets Probs Netzwerkprogrammierung 4
N Verarbeitung nach Weiterleitung in Sockets Netzwerkprogrammierung 2
A Serialisierung über Sockets möglich? Netzwerkprogrammierung 3
M sockets (security) Netzwerkprogrammierung 2
C IRC CHAT auslesen -> Sockets/input und output Streams Netzwerkprogrammierung 9
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
S Sichere Server/Client Architektur Netzwerkprogrammierung 1
Athena Grundsatzfragen zu Client-Server-Architektur / Matchmaking Netzwerkprogrammierung 1
D Projektstruktur / Architektur (Client-Server) Netzwerkprogrammierung 9
T Problem bei Findung der richtigen Architektur Netzwerkprogrammierung 3
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
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
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
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

Ähnliche Java Themen

Neue Themen


Oben