Mehrere Clients über Java-Sockets

d3rbastl3r

Bekanntes Mitglied
Hallo,

in meinem letzten Thread habe ich überlegt wie ich die Verbindung am besten managen soll (Socket oder RMI).
Nun habe ich mich für Java-Socket entschieden.

Jetzt stellt sich mir die Frage, wie ich am besten die Verbindungen mit mehreren Clients managen soll.
  1. Ich gehe über einen einzelnen Port, egal ob LogIn, CreateAccount oder sonstiger Informationsaustausch. Was der Benutzer gerade machen möchte entscheide ich anhand des Objektes welchen ich über ObjectInputStream bekomme.
  2. Ich trenne LogIn, CreateAccount und sonstigen Informationsaustausch auf mehrere Ports auf. (1234 = LogIn, 1235 = CreateAccount, 1236 = Sonstiges)
    Hier stellt sich mir nun die Frage ob ich nach dem LogIn den Port des Clients von 1234 auf 1236 ändern kann, ohne die Verbindung trennen zu müssen.
  3. Jeder Client kriegt einen Eigenen Port ...

Wie gehe ich da am sinnvollsten vor ??
 
T

TheRealSpikee

Gast
1.) Das wohl einfachste und am häufigsten verwendete System ... ist zu empfehlen ...

2.) Es gibt Systeme welche mit mehreren "Server-"diensten arbeiten ... aber als Trennung für einzelne Befehle ist das OverKill. Sowas wird nur verwendet wenn du mehrere Server-Dienst simultan brauchst und jeder Dienst sich auf eine Aufgabe spezialisiert hat *z.B. AccountManagemet , inGame-World , etc* ... also wirklich große Dinge ... und nicht einfaches spiltten von Befehlen ...
Außerdem ist es NICHT möglich den Port "zu wechseln" ohne die aktuelle Verbindung zu trennen. TCP-Verbindungen sind immer END-TO-END ... also von einem Port des Quell-Rechners zu einem Port des Ziel-Rechners ... während diese Verbindung besteht kannst du da nichts dran ändern.

3.) extrem schlechte und so gut wie nicht umsetzbare Idee ... keinen weiteren Kommentar ... vergiss diese Möglichkeit ganz einfach ...
 

d3rbastl3r

Bekanntes Mitglied
Vielen dank Erstmal :)

1.) Das wohl einfachste und am häufigsten verwendete System ... ist zu empfehlen ...

Ja, so kannte ich das auch ...

2.) Es gibt Systeme welche mit mehreren "Server-"diensten arbeiten ... aber als Trennung für einzelne Befehle ist das OverKill. Sowas wird nur verwendet wenn du mehrere Server-Dienst simultan brauchst und jeder Dienst sich auf eine Aufgabe spezialisiert hat *z.B. AccountManagemet , inGame-World , etc* ... also wirklich große Dinge ... und nicht einfaches spiltten von Befehlen ...
Außerdem ist es NICHT möglich den Port "zu wechseln" ohne die aktuelle Verbindung zu trennen. TCP-Verbindungen sind immer END-TO-END ... also von einem Port des Quell-Rechners zu einem Port des Ziel-Rechners ... während diese Verbindung besteht kannst du da nichts dran ändern.

Gilt das auch für 2 Parallel laufende Systeme die unabhängig von einander funktionieren sollten ?
z.B.: Ein Chat in einem bestimmten Programm ... (stürtzt der Server des Programms ab so kann der Chat weiter funktionieren da dieser über einen anderen Server und Port läuft ??)

3.) extrem schlechte und so gut wie nicht umsetzbare Idee ... keinen weiteren Kommentar ... vergiss diese Möglichkeit ganz einfach ...

Nach dem ich einen Server/Client Prototypen geschrieben habe ist mir auch aufgefallen dass diese Vorgehensweise einfach nur schwachsinnig ist, jedoch wäre das für mich (auf den ersten Blick) generell umsetzbar.

Hmm ... wieso ist das nicht umsetzbar ???
Welche Probleme ergeben sich bei so einer Vorgehensweise ?
Anfangs war ja meine Idee dass der Client über den UDP-Port den TCP-Port bekommt und sich dann über diesen zu dem Server verbinden kann.
 

d3rbastl3r

Bekanntes Mitglied
Ich denke Writing the Server Side of a Socket (The Java™ Tutorials > Custom Networking > All About Sockets) sollte Dir weiterhelfen.
Dort speziell der letzte Abschnitt "Supporting Multiple Clients".

VG ROlf

Ja, so habe ich meinen Prototypen dann auch umgesetzt. (ClientAccessManager nimmt eingehende verbindungen der Clients entgegen und ClientManager wird dann für jeden verbundenen Client in einem eigenen Thread gestartet und kümmert sich erstmals um alle weiteren Anfragen des Clients)
 

Xeonkryptos

Bekanntes Mitglied
Hmm ... wieso ist das nicht umsetzbar ???
Welche Probleme ergeben sich bei so einer Vorgehensweise ?.

Es gibt dann ggf. Probleme mit der Firewall: Lässt auch nicht alles zu. Weiterhin musst du bedenken, es gibt meines Wissens nach nicht unendliche Ports und irgendwann hast du das Maximum erreicht! Und wohl das größte Problem, welches mir in den Sinn kommt, es laufen auch andere Programme neben deinem und wollen auch im Internet kommunizieren und blockieren automatisch diesen Port, dann will dein Programm darüber kommunizieren und du kannst durch die Blockade keine Verbindung aufbauen.
Du musst bedenken, dass du bei Verbindungen im Internet immer einen Port wählen musst, der von KEINEM(!) anderen Programm schon verwendet wird, weil wenn dies der Fall ist, ist der Port gesperrt, macht auch Sinn. :)

Es ist halt eine schlechte Lösung. Denke mal über diese Fragen nach: Für was brauchst du für jede neue Verbindung einen neuen Port?
 

d3rbastl3r

Bekanntes Mitglied
Es gibt dann ggf. Probleme mit der Firewall: Lässt auch nicht alles zu. Weiterhin musst du bedenken, es gibt meines Wissens nach nicht unendliche Ports und irgendwann hast du das Maximum erreicht!

ja, meines wissens nach gibt es 2^16 ports = 65.536 und wenn man sagen würde (ich beschrenke mich auf den bereich zwischen 10.000 und 20.000 hat man (denk ich mal) genug :p

Und wohl das größte Problem, welches mir in den Sinn kommt, es laufen auch andere Programme neben deinem und wollen auch im Internet kommunizieren und blockieren automatisch diesen Port, dann will dein Programm darüber kommunizieren und du kannst durch die Blockade keine Verbindung aufbauen.

In meinen Augen ist das kein Problem. Wenn man den Server auf nem eigenem Server laufen lässt wo nicht so viele programme installiert sind ...

Du musst bedenken, dass du bei Verbindungen im Internet immer einen Port wählen musst, der von KEINEM(!) anderen Programm schon verwendet wird, weil wenn dies der Fall ist, ist der Port gesperrt, macht auch Sinn. :)

Naja, man kann auch vorher überprüfen ob ein gewisser port besetzt ist, wenn das der Fall sein sollte, könnte man diesen wechseln.

Es ist halt eine schlechte Lösung. Denke mal über diese Fragen nach: Für was brauchst du für jede neue Verbindung einen neuen Port?

Und natürlich hast du Recht, das ergibt keinen sinn :)
 

Xeonkryptos

Bekanntes Mitglied
In meinen Augen ist das kein Problem. Wenn man den Server auf nem eigenem Server laufen lässt wo nicht so viele programme installiert sind ...

Und was ist dann mit dem Client? Den sollen bestimmt mehr als nur du bekommen, vor allem, wenn du planst, dass mehrere Verbindungen aufgebaut werden sollen. Der User hat halt auch andere Programme laufen, die du mit einschließen musst. Du darfst nicht immer nur vom Server aus denken, sondern auch, dass der User den selben Port für seinen Client benötigt.
 

d3rbastl3r

Bekanntes Mitglied
Und was ist dann mit dem Client? Den sollen bestimmt mehr als nur du bekommen, vor allem, wenn du planst, dass mehrere Verbindungen aufgebaut werden sollen. Der User hat halt auch andere Programme laufen, die du mit einschließen musst. Du darfst nicht immer nur vom Server aus denken, sondern auch, dass der User den selben Port für seinen Client benötigt.

Meines wissens nach wird bei dem Client kein fixer port benutzt. Wenn ich dem Client sage "verbinde dich mit dem Server über den Port 6000" dann gilt dieser Port nur auf der Serverseite, auf der Clientseite läuft die verbindung über einen anderen Port.

Ach ja, vielleicht noch ne Frage zu ObjectInputStream und ObjectOutputStream.
Bei dem Datenaustausch, schließe ich da immer den OIS und OOS oder lasse ich diese so lange bestehen bis auch die verbindung zum client getrennt werden soll.

z.B.:
Java:
Object obj;

ServerSocket serverSocket;
Socket client;
ObjectInputStream ois;
ObjectOutputStream oos;

client = serverSocket.accept();
ois = new ObjectInputStream(client.getInputStream());
oos = new ObjectOutputStream(client.getOutputStream());

obj = ois.readObject();
// Schließe ich an dieser Stelle mein ois ???

oos.writeObject(new Object());
// Schließe ich an dieser Stelle mein oos ???

// Wenn ich ois und oos vorhin geschlossen habe müsste ich diese an dieser stelle wieder neu initialisieren
obj = ois.readObject();
oos.writeObject(new Object());
 

d3rbastl3r

Bekanntes Mitglied
einmal geschlossen wäre der Socket in die jeweilige Richtung tot, also wohl offen lassen

Ok, das habe ich auch erst gedacht, deshalb habe ich ObjectOutputStream und ObjectInputStream als membervariablen angelegt und schon im Konstruktor initialisiert.

doch schon bei der initialisierung von ObjectInputStream blokiert das programm (ich hätte vermutet dass dieses erst bei "ois.readObject();" blokiert)

Im bezug auf meinen, oben angegebenen code würde eine System.out-Ausgabe niemals zustande kommen wenn ich diese zwischen zeile 9 und 10 setzen würde.

Was könnte der fehler sein ??
 
S

SlaterB

Gast
ObjectInputStream will gleicht was lesen, was ein geöffneter ObjectOutputStream schon schreibt, Beginn-Token vor den ersten Objekt,
wenn beide erst ObjectInputStream öffnen warten beide Seiten ewig,
öffnet mindestens eine Seite erst den ObjectOutputStream, dann klappt es folgerichtig,
zur Sicherheit auf beiden Seiten immer erst Out, dann In

--------

eine nicht ganz zu vernachlässigende Variante zum vorherigen Theme, zum offen halten:
über den Socket-Stream nur normale Bytes versenden,

ObjectStreams in separaten Stream in ein byte[] schreiben, dann auch close() möglich,
es kommt ein byte[] raus, dieses versenden über den offengehaltenen Socket-Stream
 

d3rbastl3r

Bekanntes Mitglied
eine nicht ganz zu vernachlässigende Variante zum vorherigen Theme, zum offen halten:
über den Socket-Stream nur normale Bytes versenden,

ObjectStreams in separaten Stream in ein byte[] schreiben, dann auch close() möglich,
es kommt ein byte[] raus, dieses versenden über den offengehaltenen Socket-Stream

Verstehe nicht ganz worauf du hinaus willst :p
Soll man mit ObjecStream keine Objekte-Streamen sondern besser mit SocketStream ??
 
S

SlaterB

Gast
es wäre über eine Variante über Sockets keine ObjectStreams zu eröffnen (die komplizierte bytes verschicken) sondern einfach nur bytes,

welche bytes, das ist dann eine separate Frage, können auf beliebige Weise gewonnen werden, z.B. durch separate ObjectStreams woanders im Programm, welche du dann gleich schließen könntest, da sie dort (=woanders) den Socket nicht interessieren

vergleichbar mit Swing auf einem BufferedImage malen und in paintComponent nur das Image darstellen,
falls dir das bekannt ist ;)
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Aruetiise Socket Mehrere Clients Netzwerkprogrammierung 4
J Framework mehrere Clients/ Server-Broadcast/oracle XE/ XML Netzwerkprogrammierung 1
V Server / mehrere Clients / MySQL / Konzept Netzwerkprogrammierung 2
Z Socket [Chatprogramm] Mehrere Clients an einen Server Netzwerkprogrammierung 10
cedi Socket Mehrere Clients an einem Server Netzwerkprogrammierung 4
L Socket Chat Server für mehrere Clients Netzwerkprogrammierung 7
D Clients sollen mehrere Sessions starten Netzwerkprogrammierung 11
G Nachricht an mehrere Clients schicken Netzwerkprogrammierung 10
G Server an mehrere Clients Netzwerkprogrammierung 15
izoards Mehrere TCP Verbindungen auf einen Server [alles Local] Netzwerkprogrammierung 2
E Mehrere Sockets Netzwerkprogrammierung 2
C Mehrere Spielewelten im Multiplayer Netzwerkprogrammierung 2
S Server - Mehrere Klassen sollen Daten senden und empfangen Netzwerkprogrammierung 25
Creylon Socket Mehrere gleichzeitig eingehende Nachrichten Netzwerkprogrammierung 8
N SOCKET mehrere Requests, keep Alive serverspezifisch? Netzwerkprogrammierung 3
7 Mehrere Verbindungen gleichzeitig in einem Thread mit ApacheHTTP Netzwerkprogrammierung 7
V Authentifikation über mehrere Server? Netzwerkprogrammierung 3
G Socket Mehrere Clientanmeldungen am Server Netzwerkprogrammierung 13
B SSH mit Jsch, mehrere Befehle senden Netzwerkprogrammierung 4
F Socket Verbindungen über mehrere Server Netzwerkprogrammierung 4
M Jetty Konfiguration mehrere Handler? Netzwerkprogrammierung 2
F UDP Server - mehrere Pakete auf einmal Netzwerkprogrammierung 12
A Mehrere gleich Packete behandeln Netzwerkprogrammierung 4
R mehrere MySQL-Zugriffe Netzwerkprogrammierung 3
B Paralleler Dateitransfer: Ein Client - Mehrere Sockets? Wie connecten? Netzwerkprogrammierung 16
S Mehrere Attachments mit JavaMail API auslesen Netzwerkprogrammierung 3
O Mehrere Datei per DataInput/OutputStream über Socket Netzwerkprogrammierung 12
A Datenverteilung: Mehrere Threads verwenden? Netzwerkprogrammierung 4
T Netzwerkchat Problem: Mehrere Nachrichten ~ Anfängerproblem Netzwerkprogrammierung 3
W Bestimmt IP Adresse verwenden wenn man mehrere hat Netzwerkprogrammierung 5
A Jakarta Commons HTTPClient: Mehrere Requests gleichzeitig Netzwerkprogrammierung 2
R Mehrere Dateien über einen Socket senden Netzwerkprogrammierung 2
L mehrere Streams über einen Socket? Netzwerkprogrammierung 8
V Mehrere Streams durch einen Stream senden Netzwerkprogrammierung 14
E Mehrere / bestimmte Netzwerkkarten ansteuern Netzwerkprogrammierung 10
F Mehrere Attachments mit JavaMail API Netzwerkprogrammierung 2
G Proxy und mehrere Verbindungen Netzwerkprogrammierung 4
G Mehrere SSL Verbindungen Netzwerkprogrammierung 2
A Mit Client auf mehrere Server zugreifen Netzwerkprogrammierung 5
M Mehrere Ports gleichzeitig abhören Netzwerkprogrammierung 5
TRunKX Ein Port mehrere Verbindungen? Netzwerkprogrammierung 7
L JavaMail: Automatisches Email Versand (mehrere Empfänger) Netzwerkprogrammierung 4
U Einen HandlerThread, der mehrere Verbindungen verwaltet? Netzwerkprogrammierung 2
X mehrere Request über eine HttpURLConnection Netzwerkprogrammierung 2
M Socket Senden an alle verbundenen Clients Netzwerkprogrammierung 3
M Socket Netzwerk Übertragung zwischen 4 Clients Netzwerkprogrammierung 2
G Gui von 2 Clients Synchronisieren Netzwerkprogrammierung 2
F Schulprojekt erweitern - Online Quiz mit mehreren Clients - Was benötige ich ? Netzwerkprogrammierung 0
P Socket Viele Clients bedienen mit Vert.x Netzwerkprogrammierung 9
M MultiClient Server - Senden an alle Clients Netzwerkprogrammierung 8
G Multiple Clients and one Server --> java.lang.NullPointerException Netzwerkprogrammierung 1
M Teilnehmerliste vom Server auch an alle Clients senden Netzwerkprogrammierung 0
Luk10 Server / Client: Clients speichern! Netzwerkprogrammierung 6
C Socket Identifikation des clients nach der accept() Methode Netzwerkprogrammierung 2
A Socket Server: Message an verschiedene Clients senden Netzwerkprogrammierung 4
B Socket Liste von clients - multicast Netzwerkprogrammierung 4
M Anzahl Clients aus Start- und Endadr. berechnen Netzwerkprogrammierung 54
R Viele Clients ein Server Netzwerkprogrammierung 8
borobudur Synchronisation von Clients Netzwerkprogrammierung 10
S Socket nach anderen clients im netzwerk suchen Netzwerkprogrammierung 3
L RMI Informationen über die Clients herausfinden Netzwerkprogrammierung 5
H Neues NIO problem nachricht an alle clients Netzwerkprogrammierung 3
D Probleme bei mehreren Clients uns Senden von Messages Netzwerkprogrammierung 16
P Socket Datei von Client zum Server übertragen --> Weiterleitung an Clients Netzwerkprogrammierung 16
F Erhalten und Senden von Nachrichten anhand des Indexes des Clients Netzwerkprogrammierung 19
H Hilfe bei multiplen Clients Netzwerkprogrammierung 7
cowabunga1984 Transferierte Datenmenge eines SOAP Clients (JAX-WS) anzeigen Netzwerkprogrammierung 2
T Administration von Software auf Clients im Netzwerk Netzwerkprogrammierung 6
D Netzwerkprobleme bei mehreren Clients Netzwerkprogrammierung 4
F Peer to Peer Verbindung zwischen mehreren Clients? Netzwerkprogrammierung 8
A Server mit mehreren Clients Netzwerkprogrammierung 2
5 Webservice max. mit 5 Clients möglich Netzwerkprogrammierung 10
M clients untereinander kommunizieren Netzwerkprogrammierung 2
A RMI: Wieviele Clients können sich gleichzeitig anmelden? Netzwerkprogrammierung 34
B Rmi Kommunikation Server zu mehreren Clients? Netzwerkprogrammierung 3
T Am RMI-Server: IP des Clients ermitteln? Netzwerkprogrammierung 2
J SecurityManager - Server-Zugriff nur von bestimmten Clients? Netzwerkprogrammierung 2
T RMI - Probleme beim Starten des Clients Netzwerkprogrammierung 4
T Chat mit mehreren Clients Netzwerkprogrammierung 3
G Anzahl verbundener Clients zu einem FTP-Server ermitteln? Netzwerkprogrammierung 4
D Netzwerk Betrachtung mit vielen Clients Netzwerkprogrammierung 2
G Nachricht von server an alle clients senden Netzwerkprogrammierung 6
I IP Adresse des Clients einer Socket Verbindung Netzwerkprogrammierung 2
S Server mit mehreren Clients Nachrichten austauschen Netzwerkprogrammierung 6
K Tabelle im Web über Listener aufrufen Netzwerkprogrammierung 1
F Verbindung zu einem LDAP Server über Java Netzwerkprogrammierung 4
S Socket Bilder über Socket Senden Netzwerkprogrammierung 0
B Zip Dateien über FTP laden Netzwerkprogrammierung 2
x46 byte[] über BufferedReader auslesen Netzwerkprogrammierung 18
E Socket Parameter über Sockets übergeben und auslesen ! Netzwerkprogrammierung 5
L Webbasierte Anwendung - Authentifizierung über LDAP/ActiveDirectory Netzwerkprogrammierung 5
J Probleme mit Multicast über IPv6, DatagramChannel Netzwerkprogrammierung 1
S Daten über TCP/IP senden Netzwerkprogrammierung 3
T Broadcast-message über spez. Netzwerk-Schnittstelle Netzwerkprogrammierung 1
T Mikrofonaudio über Java Server an Webbrowser streamen Netzwerkprogrammierung 13
M Erstelltes Programm über Internet Browser ausführen Netzwerkprogrammierung 26
T VPN-Verbindung über Java Netzwerkprogrammierung 4
V Einfachen Javaserver über das Internet erreichbar machen Netzwerkprogrammierung 2
J FTP Upload über Proxy funktioniert nicht Netzwerkprogrammierung 1
E Kurze Textnachrichten über einen Server von meinem Handy auf den Computer laden. Netzwerkprogrammierung 9

Ähnliche Java Themen

Neue Themen


Oben