#1 15. Juni 2013 Zuletzt bearbeitet: 15. Juni 2013 Multithreaded Server - Anzahl Clients Hey, ich habe einen simplen Multithreaded Server: PHP: public void go () { try { if ( port == 0 ) { s = new ServerSocket ( 1893 ); } else { s = new ServerSocket ( port ); } System . out . println ( "Server gestartet | Port: " + s . getLocalPort ()); status = 1 ; getServerStatus (); for (;;) { server = s . accept (); System . out . println ( "Starte Thread " + i ); t = new ThreadHandler ( server , i ); t . start (); i ++; } } catch ( Exception e ) { e . printStackTrace (); } } Nun wird bei jedem neuen Clienten der sich mit dem Server verbindet ein neuer Thread gestartet. Allerdings habe ich im Moment keine Ahnung wie ich es anstellen kann damit der Server merkt wenn sich ein Client wieder verabschiedet und ich die aktuelle Anzahl an Clienten immer parat habe. Des weiteren hab/hatte ich ein kleines Problem da ich gerne testen möchte ohne einen Button etc. zu drücken ob der Server bereits läuft und auf welchem Port. Das hab ich notdürftig erstmal so gelöst: PHP: public int [] getServerStatus () { int [] infos ; int anzClients = ( i - 1 ); if ( status == 1 ) { int serverPort = s . getLocalPort (); infos = new int [] { status , serverPort , anzClients }; } else { infos = new int [] { 0 , 0 , 0 }; } return infos ; } Sobald der Server gestartet wird wird die getServerStatus Methode aufgerufen. Nun hab ich in der GUI nen Button der eben die getServerStatus Methode aufruft um zu schauen was Sache ist. Allerdings möchte ich gerne das dies automatisch geschieht immer wenn der Server startet bzw. beendet wird. Die Notlösung funktioniert zum Serverstart ganz gut ist aber halt fürn ***** Btw. Nicht wundern... das beenden des Servers funktioniert eh (noch) nicht da die Threads logischerweise geblockt sind. Aber das ist ein anderes Thema Ich bin mir sicher das es bestimmt besser geht, aber steinigt mich net, bin da net so der Pro + Multi-Zitat Zitieren
#2 15. Juni 2013 AW: Multithreaded Server - Anzahl Clients Wie sieht den deine Klasse von deinem ClientThread aus ? Also das was den Runnable bzw Thread implementiert + Multi-Zitat Zitieren
#3 18. Juni 2013 AW: Multithreaded Server - Anzahl Clients Da mir Mr. Murdoc ne PN geschrieben hab zwecks dem Einstellen meiner Lösung bin ich mal so nett Zum eig. Projekt: Es geht/ging um eine Personendatensatzverwaltung. Mit einem Clienten und einem Server. Die Personendaten wurden in ein Personenobjekt gespeichert und zum Server geschickt. Da gleichzeitig/kurz vorher allerdings auch auf dem Server eine gewisse Methode dann ausgeführt werden musste und sich der Spaß dann verhaspelt hat -> Irgendwas mit Error im Streamheader oder sowas, weiß die Fehlermeldung nicht mehr genau. Auf jeden Fall ist diese Klasse daraus entstanden die 2 Konstruktoren hat. Warum 2? Zum einen wird bei gewissen Tätigkeiten die auf der Clientseite ausgeführt werden eben das Personenobjekt und ein Methodenaufruf an den Server gesendet. Zum anderen gibt es z.b auch eine Sortiermethode bei der eben nur die Methode aufgeufen wird, daher die 2 Konstruktoren. Nja auf jeden Fall habe ich das nun so gelöst das der Client beim connecten/disconnecten mit dem Server jeweils eine Methode auf dem Server aufruft und so die Clienten gezählt werden können. Haken dabei ist natürlich, der Client muss ordnungsgemäß beendet werden. Aber davon gehen wir einfach mal aus Für das Projekt und das Vorhaben mehr als ausreichend. PHP: package models ; import java . io . Serializable ; public class Transfer implements Serializable { private Person p ; private int methode ; private boolean connectstatus ; public Transfer ( Person p , int methode ) { this . p = p ; this . methode = methode ; } public Transfer ( int methode ) { this . methode = methode ; } public int getMethode () { return methode ; } public Person getP () { return p ; } public void setMethode ( int methode ) { this . methode = methode ; } public void setP ( Person p ) { this . p = p ; } } Übertragung: PHP: public void anmelden ( Transfer transfer ) { try { os . writeObject ( transfer ); os . flush (); } catch ( IOException ex ) { Logger . getLogger ( Model .class. getName ()). log ( Level . SEVERE , null , ex ); } } Verarbeitung: PHP: public void run () { try { is = new ObjectInputStream ( server . getInputStream ()); PrintWriter out = new PrintWriter ( server . getOutputStream (), true ); while (( transfer = ( Transfer ) is . readObject ()) != null ) { switch ( transfer . getMethode ()) { case 1 : objekt_holen ( transfer . getP ()); break; case 2 : senden (); break; case 3 : sichern (); break; case 4 : laden (); break; case 5 : sortieren (); break; case 6 : loeschen (); break; case 7 : ende (); break; case 8 : clientAbmelden (); break; case 9 : clientAnmelden (); break; default: System . out . println ( "fehler switch-anwendung serverseitig" ); } Beim Rest wird eben einfach der aktuelle Wert des Labels geholt und eben +1 oder -1 gemacht. Bin mit der Lösung zufrieden + Multi-Zitat Zitieren
#4 18. Juni 2013 AW: Multithreaded Server - Anzahl Clients Kann man so machen und ist für viele Anwendungsfälle ausreichend, wenn der Bug mit dem Client weghängen nicht stört Um das zu umgehen könnte man eine Art heartbeat-Objekt vom Server zum Client und zurück senden, um zu gucken ob die Gegenseite noch da ist. Wenn nichts zurückkommt einfach die Verbindung schließen und den Thread beenden. Ein kleinen Verbesserungsvorschlag zum switch-case: enum statt magic numbers Die Dinger sind echt cool, machen den Code so schön leserlich und gehen schneller von der Hand als "public static final int STATUS = 1" oder so 1 Person gefällt das. + Multi-Zitat Zitieren