Kommentare formatiert

This commit is contained in:
BerdanInformatik123 2021-05-16 20:56:13 +02:00
parent c1bb7a2070
commit c9a44df33b

View file

@ -20,324 +20,295 @@ import java.awt.event.ActionEvent;
/** /**
* Hauptklasse des Clients * Hauptklasse des Clients
*
* @version 0.1.3 * @version 0.1.3
* @author berdan * @author berdan
*/ */
public class Client1 extends JFrame { public class Client1 extends JFrame {
/**
/* * Hier werden Objekte und Variablen deklariert, damit diese in allen
Hier werden Objekte und Variablen deklariert, damit diese * Methoden genutzt werden können.
in allen Methoden genutzt werden können. */
*/ private static JPanel contentPane;
private static JPanel contentPane; JTextField txtMessage;
JTextField txtMessage; private static JTextField txtUsername;
private static JTextField txtUsername; public static String currentText = " ";
public static String currentText = " "; public static int i = 0;
public static int i = 0; public static Object tosend = new Message("Leer", "Leer");
public static Object tosend = new Message("Leer", "Leer"); public static Client1 t1;
public static Client1 t1; public static Socket socket;
public static Socket socket; public static ObjectInputStream obinstr;
public static ObjectInputStream obinstr; public static ObjectOutputStream oboust;
public static ObjectOutputStream oboust; public static boolean verbunden = false;
public static boolean verbunden = false; public static JTextArea textArea = new JTextArea();
public static JTextArea textArea = new JTextArea(); public static int anzahlVersuche = 0; //Ist gleich die AN
public static int anzahlVersuche = 0; //Ist gleich die AN public static int anzahlRekursionen = 0;
public static int anzahlRekursionen = 0; public static Message temp = new Message("leer", "leer");
public static Message temp = new Message("leer", "leer");
/**
/* * In der main Methode wird das GUI erstellt und die start() Methode
In der main Methode wird das GUI erstellt und die * aufgerufen.
start() Methode aufgerufen. *
*/ * @param args
* @throws InterruptedException
public static void main(String[] args) throws InterruptedException { */
t1 = new Client1(); public static void main(String[] args) throws InterruptedException {
EventQueue.invokeLater(new Runnable() { t1 = new Client1();
public void run() { EventQueue.invokeLater(new Runnable() {
try { public void run() {
Client1 frame = new Client1(); try {
frame.setVisible(true); Client1 frame = new Client1();
} catch (Exception e) { frame.setVisible(true);
e.printStackTrace(); } catch (Exception e) {
} e.printStackTrace();
} }
}); }
});
try { try {
start(); start();
} catch (ClassNotFoundException e) { } catch (ClassNotFoundException | IOException e) {
// TODO Auto-generated catch block e.printStackTrace();
e.printStackTrace(); }
} catch (IOException e) { }
// TODO Auto-generated catch block
e.printStackTrace(); /**
} * In der Methode Client1() wird das GUI und die Befehle die durch einen
} * Click des Button's ausgelöst werden festgelegt (Konstruktur)
*/
/* public Client1() {
In der Methode Client1() wird das GUI setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
und die Befehle die durch einen Click des setBounds(100, 100, 450, 300);
Button's ausgelöst werden festgelegt contentPane = new JPanel();
*/ contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);
public Client1() { contentPane.setLayout(null);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 450, 300); txtMessage = new JTextField();
contentPane = new JPanel(); txtMessage.setText("Message");
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5)); txtMessage.setBounds(20, 230, 218, 20);
setContentPane(contentPane); contentPane.add(txtMessage);
contentPane.setLayout(null); txtMessage.setColumns(10);
txtMessage = new JTextField(); txtUsername = new JTextField();
txtMessage.setText("Message"); txtUsername.setText("Username");
txtMessage.setBounds(20, 230, 218, 20); txtUsername.setBounds(20, 11, 86, 20);
contentPane.add(txtMessage); contentPane.add(txtUsername);
txtMessage.setColumns(10); txtUsername.setColumns(10);
txtUsername = new JTextField(); /**
txtUsername.setText("Username"); * Der Button "Send" nimmt die aktuelle Nachricht, welche im Textfeld
txtUsername.setBounds(20, 11, 86, 20); * "message" geschrieben wurde und schreibt diese als ein Message-Objekt
contentPane.add(txtUsername); * in den Output-Stream an den Server, falls die Socket bereits
txtUsername.setColumns(10); * verbunden ist.
*
* Falls die Nachricht "exit" sein sollte, wird die GUI beendet.
/* */
Der Button "Send" nimmt die aktuelle Nachricht, JButton btnSend = new JButton("Send");
welche im Textfeld "message" geschrieben wurde und btnSend.addActionListener(new ActionListener() {
schreibt diese als ein Message-Objekt in den Output-Stream public void actionPerformed(ActionEvent arg0) {
an den Server, falls die Socket bereits verbunden ist.
if (verbunden) {
Falls die Nachricht "exit" sein sollte, wird
die GUI beendet. String themessage = txtMessage.getText();
*/ String theusername = txtUsername.getText();
JButton btnSend = new JButton("Send"); tosend = new Message(theusername, themessage);
btnSend.addActionListener(new ActionListener() { i = 1;
public void actionPerformed(ActionEvent arg0) {
temp = new Message(theusername, themessage);
if(verbunden){ System.out.println("Button pressed");
String themessage = txtMessage.getText(); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
String theusername = txtUsername.getText();
try {
tosend = new Message(theusername, themessage); oboust.writeObject(tosend);
i = 1; oboust.flush();
} catch (IOException e) {
temp = new Message(theusername, themessage); e.printStackTrace();
System.out.println("Button pressed"); } catch (Exception k) {
print("KEINE VERBINDUNG");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); }
try{ if (temp.getMessage().equals("exit")) {
try { System.exit(0);
oboust.writeObject(tosend); }
oboust.flush(); txtMessage.setText("");
} catch (IOException e) {
e.printStackTrace(); }
}
} catch( Exception k){ }
print("KEINE VERBINDUNG"); });
}
btnSend.setBounds(264, 229, 79, 23);
if(temp.getMessage().equals("exit")){ contentPane.add(btnSend);
System.exit(0);
} /**
* Hier wird die textArea, auf welcher der Text ausgegeben wird
txtMessage.setText(""); * initialisiert
*/
} textArea = new JTextArea(currentText);
textArea.setLineWrap(true);
} textArea.setForeground(Color.BLACK);
}); textArea.setBackground(Color.LIGHT_GRAY);
textArea.setBounds(20, 42, 323, 176);
btnSend.setBounds(264, 229, 79, 23); contentPane.add(textArea);
contentPane.add(btnSend);
/**
/* * Der Start Button sorgt sorgt dafür, dass der Username festgesetzt
Hier wird die textArea, auf welcher der Text ausgegeben wird * wird, wodurch er nicht veränderlich ist. Außerdem wird die globale
initialisiert * Variabel j von 0 auf 1 gestzt, wodurch die start-Methode weiß, dass
* sie eine Verbindung aufbauen soll.
*/ */
textArea = new JTextArea(currentText); JButton btnStart = new JButton("Start");
textArea.setLineWrap(true); btnStart.addActionListener(new ActionListener() {
textArea.setForeground(Color.BLACK); public void actionPerformed(ActionEvent arg0) {
textArea.setBackground(Color.LIGHT_GRAY);
textArea.setBounds(20, 42, 323, 176); txtUsername.setEditable(false);
contentPane.add(textArea); txtUsername.setEnabled(false);
verbunden = true;
/*
Der Start Button sorgt sorgt dafür, dass der Username }
festgesetzt wird, wodurch er nicht veränderlich ist. });
Außerdem wird die globale Variabel j von 0 auf 1 gestzt, btnStart.setBounds(116, 10, 89, 23);
wodurch die start-Methode weiß, dass sie eine Verbindung contentPane.add(btnStart);
aufbauen soll.
}
*/
/**
JButton btnStart = new JButton("Start"); * In der Print-Methode wird der neue Text (also eine neue Nachricht) auf
btnStart.addActionListener(new ActionListener() { * die textArea abgebildet.
public void actionPerformed(ActionEvent arg0) { *
* @param neuerText
txtUsername.setEditable(false); */
txtUsername.setEnabled(false); public static void print(String neuerText) {
verbunden = true; currentText = neuerText + "\n" + currentText;
} textArea.setText(currentText);
}); }
btnStart.setBounds(116, 10, 89, 23);
contentPane.add(btnStart); /**
* Die start-Methode wartet, bis die Variable verbunden durch Klicken des
* Start Buttons auf true gesetzt wird, erst dann beginnt die eigentliche
* Methode.
} *
* Es wird dann eine Verbindung zum Socket über den Port 1236 aufgebaut.
/* * Sollte dies nicht Möglich sein, wird die Fehlermeldung in der GUI
In der Print-Methode wird der neue Text (also eine neue Nachricht) * ausgegeben, sodass der Nutzer weiß, dass keine Vebrindung möglich ist.
auf die textArea abgebildet. *
*/ * Es wird im Sekundentakt nach einer neuen Verbindung gesucht.
*
public static void print(String neuerText){ * @throws IOException
currentText = neuerText + "\n" + currentText; * @throws ClassNotFoundException
* @throws InterruptedException
textArea.setText(currentText); */
} public static void start() throws IOException, ClassNotFoundException, InterruptedException {
/* while (!verbunden) {
Die start-Methode wartet, bis die Variable verbunden durch Klicken Thread.sleep(100);
des Start Buttons auf true gesetzt wird, erst dann beginnt die }
eigentliche Methode.
txtUsername.setEnabled(false);
Es wird dann eine Verbindung zum Socket über den Port Scanner scan = new Scanner(System.in);
1236 aufgebaut. Sollte dies nicht Möglich sein, wird die
Fehlermeldung in der GUI ausgegeben, sodass der Nutzer weiß, try {
dass keine Vebrindung möglich ist. socket = new Socket("localhost", 1236);
oboust = new ObjectOutputStream(socket.getOutputStream());
Es wird im Sekundentakt nach einer neuen Verbindung gesucht. obinstr = new ObjectInputStream(socket.getInputStream());
print("VERBINDUNG HERGESTELLT");
*/ } catch (Exception KeineSocket) {
print("SERVER ANTWORTET NICHT");
public static void start() throws IOException, ClassNotFoundException, InterruptedException{ try {
Thread.sleep(5000);
while(!verbunden){ } catch (InterruptedException e) {
Thread.sleep(100); // TODO Auto-generated catch block
} e.printStackTrace();
}
txtUsername.setEnabled(false);
Scanner scan = new Scanner(System.in); anzahlRekursionen++;
if (anzahlRekursionen == 10) {
try{ print("KEINE ANTWORT, CLIENT WIRD BEENDET");
socket = new Socket( "localhost", 1236 ); Thread.sleep(10000);
oboust = new ObjectOutputStream(socket.getOutputStream()); System.exit(0);
obinstr = new ObjectInputStream(socket.getInputStream()); }
print("VERBINDUNG HERGESTELLT"); start();
}catch(Exception KeineSocket){ System.exit(0);
print("SERVER ANTWORTET NICHT");
try { }
Thread.sleep(5000);
} catch (InterruptedException e) { Object erhalten = null;
// TODO Auto-generated catch block Message message = new Message("leer", "leer");
e.printStackTrace();
} /**
anzahlRekursionen++; * Die While Schleife ist der Listener, dieser wartet auf Nachrichten
if(anzahlRekursionen == 10){ * aus dem Server und gibt diese dann aus.
print("KEINE ANTWORT, CLIENT WIRD BEENDET"); *
Thread.sleep(10000); * Im Falle eines Verindungsabbruches versucht er es 5 mal im Abstand
System.exit(0); * von 2 Sekunden nochmal eine Nachricht zu senden und ruft dann wieder
} * die start() Methode auf. wodurch die Verbindung nochmal neu
start(); * hergestellt wird.
System.exit(0); *
* Die While-Schleife wird abgebrochen, sobald die Nachricht, welche der
} * Benutzer über das GUI sendet "exit" lautet.
*
*/
Object erhalten = null;
Message message = new Message("leer", "leer"); while (!temp.getMessage().equals("exit")) {
try {
/* //System.out.println("hile4");
Die While Schleife ist der Listener, System.out.println("Nachricht erhalten");
dieser wartet auf Nachrichten aus dem Server und erhalten = obinstr.readObject(); //Bleibt hier stehen, bis ein neues Object reinkommt
gibt diese dann aus.
message = (Message) erhalten;
Im Falle eines Verindungsabbruches versucht er System.out.println("[" + message.getUsername() + "] " + message.getMessage());
es 5 mal im Abstand von 2 Sekunden nochmal eine Nachricht String Ausgeben = message.getTime() + " [" + message.getUsername() + "] " + message.getMessage();
zu senden und ruft dann wieder die start() Methode auf. print(Ausgeben);
wodurch die Verbindung nochmal neu hergestellt wird. //System.out.println("[CLIENT] NACHRICHT ERHALTEN");
Die While-Schleife wird abgebrochen, sobald die Nachricht, oboust.flush();
welche der Benutzer über das GUI sendet "exit" lautet.
} catch (SocketException h) {
*/ System.out.println(h);
print("VERBINDUNGSABBRUCH");
anzahlVersuche++;
while(!temp.getMessage().equals("exit")){ Thread.sleep(2000);
//System.out.println("WHILE");
try{ if (anzahlVersuche == 5) {
//System.out.println("hile4"); anzahlVersuche = 0;
System.out.println("Nachricht erhalten"); anzahlRekursionen++;
erhalten = obinstr.readObject(); //Bleibt hier stehen, bis ein neues Object reinkommt
if (anzahlRekursionen == 10) {
message = (Message)erhalten; print("KEINE ANTWORT, CLIENT WIRD BEENDET");
System.out.println("[" + message.getUsername() + "] " + message.getMessage()); Thread.sleep(10000);
String Ausgeben = message.getTime() + " [" + message.getUsername() + "] " + message.getMessage(); System.exit(0);
print(Ausgeben);
//System.out.println("[CLIENT] NACHRICHT ERHALTEN"); }
oboust.flush(); start();
System.exit(0);
} }
catch(SocketException h){ } catch (Exception f) {
System.out.println(h); Thread.sleep(1000);
print("VERBINDUNGSABBRUCH"); }
anzahlVersuche++;
}
Thread.sleep(2000);
/**
* Nach dem Abbruch der While Schleife, was nur bei der Nachricht exit
if(anzahlVersuche==5){ * passiert, schließt der Client den ObjectOutputstream,
anzahlVersuche = 0; * Objectinputstream und den Socket und beendet dann das Programm
anzahlRekursionen++; */
oboust.close();
if(anzahlRekursionen == 10){ obinstr.close();
print("KEINE ANTWORT, CLIENT WIRD BEENDET"); socket.close();
Thread.sleep(10000);
System.exit(0); System.exit(0);
} }
start();
System.exit(0);
}
}
catch(Exception f){
Thread.sleep(1000);
}
}
/*
Nach dem Abbruch der While Schleife, was nur bei der
Nachricht exit passiert, schließt der Client
den ObjectOutputstream, Objectinputstream und den Socket
und beendet dann das Programm
*/
oboust.close();
obinstr.close();
socket.close();
System.exit(0);
}
} }