[Java] Multithreaded Server - Anzahl Clients

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von Targa, 15. Juni 2013 .

  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 ) {
                    
    = new  ServerSocket ( 1893 );
                } else {
                    
    = new  ServerSocket ( port );
                }
               
                
    System . out . println ( "Server gestartet | Port: "  s . getLocalPort ());
                
    status  1 ;
                
    getServerStatus ();
                for (;;) 
                {
                    
    server  s . accept ();
                    
    System . out . println ( "Starte Thread "  i );
                    
    = 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
     
  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
     
  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 ;
            
    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 ;
        }
        
        

    Ü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
     
  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.
  5. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.