2021-05-15 20:53:58 +00:00
/ *
* Copyright ( C ) 2021 eichehome
*
* This program is free software : you can redistribute it and / or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation , either version 3 of the License , or
* ( at your option ) any later version .
*
* This program is distributed in the hope that it will be useful ,
* but WITHOUT ANY WARRANTY ; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE . See the
* GNU General Public License for more details .
*
* You should have received a copy of the GNU General Public License
* along with this program . If not , see < http : //www.gnu.org/licenses/>.
* /
package server ;
import java.io.EOFException ;
import java.io.IOException ;
import java.io.ObjectInputStream ;
import java.io.ObjectOutputStream ;
2021-05-15 22:43:36 +00:00
import java.util.logging.Level ;
import java.util.logging.Logger ;
2021-05-15 20:53:58 +00:00
import utils.Message ;
/ * *
2021-05-16 18:03:38 +00:00
* Diese Klasse stellt einen Thread dar , die Nachrichten , die er in einem Stream
* erhällt an einen Client weiterleitet .
*
* @version 1 . 0 . 0
2021-05-15 20:53:58 +00:00
* @author eichehome
* /
2021-05-16 18:03:38 +00:00
public class ClientSendMessageThread extends Thread {
2021-05-15 20:53:58 +00:00
2021-05-16 18:03:38 +00:00
/ * *
* Attribut , welches den Stream enthält , in dem die Nachrichten an den
* Client geschickt werden .
* /
2021-05-15 20:53:58 +00:00
private final ObjectOutputStream out ;
2021-05-16 18:03:38 +00:00
/ * *
* Attribut , welches den Stream enthält , in dem die Nachrichten ankommen ,
* die an den Client geschickt werden sollen .
* /
2021-05-15 20:53:58 +00:00
private final ObjectInputStream pipedObjectInputStream ;
2021-05-16 18:03:38 +00:00
/ * *
* Attribut , welches einen Zeiger auf das zentrale Verzeichnis aller
* verbundenen Clients enthält .
* /
2021-05-15 20:53:58 +00:00
private ClientStore clientStore ;
2021-05-15 22:43:36 +00:00
/ * *
2021-05-16 18:03:38 +00:00
* Konstruktor
*
* @param out Stream , in dem der Thread die Nachrichten an den Client
* schickt .
* @param pipedObjectInputStream Stream , in dem der Thread die Nachrichten
* von anderen Threads erhält .
* @param clientStore Zeiger auf das zentrale Verzeichnis der Clients , um
* sich dort austragen zu können .
* /
public ClientSendMessageThread ( ObjectOutputStream out , ObjectInputStream pipedObjectInputStream , ClientStore clientStore ) {
this . out = out ;
this . pipedObjectInputStream = pipedObjectInputStream ;
this . clientStore = clientStore ;
}
/ * *
* Hauptmethode der Threads , in der alles abläuft .
2021-05-15 22:43:36 +00:00
* /
2021-05-15 20:53:58 +00:00
public void run ( ) {
boolean continueLoop = true ;
while ( continueLoop ) {
try {
Message empfangen = null ;
2021-05-16 18:03:38 +00:00
while ( ( empfangen = ( Message ) this . pipedObjectInputStream . readObject ( ) ) ! = null ) { //Hier bleibt dieser Thread stehen bis er eine Nchricht erhält, die er an den Client weiterleiten soll.
2021-05-15 20:53:58 +00:00
this . out . writeObject ( empfangen ) ;
this . out . flush ( ) ;
2021-05-16 18:03:38 +00:00
Logger . getLogger ( ClientSendMessageThread . class . getName ( ) ) . log ( Level . INFO , String . format ( " Sending Thread %d: Nachricht weitergegeben " , this . getId ( ) ) ) ;
2021-05-15 20:53:58 +00:00
}
} catch ( ClassNotFoundException ex ) {
2021-05-16 18:03:38 +00:00
Logger . getLogger ( ClientSendMessageThread . class . getName ( ) ) . log ( Level . SEVERE , String . format ( " Sending Thread %d: Fehler: %s " , this . getId ( ) , ex ) ) ;
2021-05-15 20:53:58 +00:00
} catch ( EOFException ex ) {
2021-05-16 18:03:38 +00:00
Logger . getLogger ( ClientSendMessageThread . class . getName ( ) ) . log ( Level . SEVERE , String . format ( " Sending Thread %d: Fehler: %s " , this . getId ( ) , ex ) ) ;
2021-05-15 20:53:58 +00:00
continueLoop = false ;
2021-05-16 18:03:38 +00:00
this . clientStore . close ( this ) ;
this . clientStore . removeClient ( this ) ;
} catch ( IOException ex ) { //Diese Exeption zeigt, dass sich der Stream zum Client geschlossen hat und deshalb Aufräumarbeiten angebracht sind.
Logger . getLogger ( ClientSendMessageThread . class . getName ( ) ) . log ( Level . INFO , String . format ( " Sending Thread %d: Pipe wurde beendet " , this . getId ( ) ) ) ;
this . clientStore . close ( this ) ;
this . clientStore . removeClient ( this ) ;
2021-05-15 20:53:58 +00:00
continueLoop = false ;
}
}
}
}