Hey Leute,
ich hab hier nen winziges Problemchen.
Also wir sollen in der Schule ein Schnick-Schnack-Schnuck-Programm schreiben und zwar auf Basis eines vorgegebenen Chatprogramm.
Leider hat der Programmierer des Chatprogramms (nicht der Lehrer) nicht sehr weit gedacht und keine "Server trennen Funktion" mit eingebaut ebenso wenig wie "Clients vom Server kicken".
Nun musste ich das alles selber machen, was mich durch komplizierte unnötige Programmierung des Vorpragrammierers zu einigen Problemen geführt hat.
Hier erstmal der Programmcode:
GUIClient:
EchoClient:
Client
Connection
ich hab hier nen winziges Problemchen.
Also wir sollen in der Schule ein Schnick-Schnack-Schnuck-Programm schreiben und zwar auf Basis eines vorgegebenen Chatprogramm.
Leider hat der Programmierer des Chatprogramms (nicht der Lehrer) nicht sehr weit gedacht und keine "Server trennen Funktion" mit eingebaut ebenso wenig wie "Clients vom Server kicken".
Nun musste ich das alles selber machen, was mich durch komplizierte unnötige Programmierung des Vorpragrammierers zu einigen Problemen geführt hat.
Hier erstmal der Programmcode:
GUIClient:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;
/**
*
* @version 1.0 vom 14.01.2014
*
*/
public class GUIClient extends JFrame
{
private EchoClient ec;
private Rules ru;
private JButton bconnect = new JButton();
public JButton bEchse = new JButton();
public JButton bPapier = new JButton();
public JButton bSchere = new JButton();
public JButton bSpock = new JButton();
public JButton bStein = new JButton();
private JButton bRules = new JButton();
private JButton bExit = new JButton();
private JLabel jIP = new JLabel();
private JLabel jNickname = new JLabel();
private JLabel jPort = new JLabel();
private JTextField jtIP = new JTextField();
private JTextField jtPort = new JTextField();
private JTextField jtNick = new JTextField();
private JScrollPane jspjtaLog = new JScrollPane();
public JTextArea jtaLog = new JTextArea("");
private boolean b;
// Ende Attribute
public GUIClient(String title)
{
// Frame-Initialisierung
super(title);
addWindowListener(new WindowAdapter()
{
public void windowClosing(WindowEvent evt)
{
dispose();
}
});
int frameWidth = 521;
int frameHeight = 345;
setSize(frameWidth, frameHeight);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x = (d.width - getSize().width) / 2;
int y = (d.height - getSize().height) / 2;
setLocation(x, y);
setResizable(false);
setVisible(true);
// Anfang Komponenten
Panel cp = new Panel(null);
add(cp);
bconnect.setBounds(24, 24, 201, 57);
bconnect.setText("Mit Server verbinden...");
bconnect.setMargin(new Insets(2, 2, 2, 2));
cp.add(bconnect);
bconnect.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
bconnect_ActionPerformed(evt);
}
});
bEchse.setBounds(48, 165, 129, 41);
bEchse.setText("Echse");
bEchse.setEnabled(false);
bEchse.setMargin(new Insets(2, 2, 2, 2));
cp.add(bEchse);
bEchse.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
bEchse_ActionPerformed(evt);
}
});
bPapier.setBounds(336, 110, 129, 41);
bPapier.setText("Papier");
bPapier.setEnabled(false);
bPapier.setMargin(new Insets(2, 2, 2, 2));
cp.add(bPapier);
bPapier.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
bPapier_ActionPerformed(evt);
}
});
bSchere.setBounds(48, 110, 129, 41);
bSchere.setText("Schere");
bSchere.setEnabled(false);
bSchere.setMargin(new Insets(2, 2, 2, 2));
cp.add(bSchere);
bSchere.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
bSchere_ActionPerformed(evt);
}
});
bSpock.setBounds(48, 220, 129, 41);
bSpock.setText("Spock");
bSpock.setEnabled(false);
bSpock.setMargin(new Insets(2, 2, 2, 2));
cp.add(bSpock);
bSpock.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
bSpock_ActionPerformed(evt);
}
});
bStein.setBounds(192, 110, 129, 41);
bStein.setText("Stein");
bStein.setEnabled(false);
bStein.setMargin(new Insets(2, 2, 2, 2));
cp.add(bStein);
bStein.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
bStein_ActionPerformed(evt);
}
});
bRules.setBounds(112, 272, 65, 25);
bRules.setText("Regeln");
bRules.setMargin(new Insets(2, 2, 2, 2));
cp.add(bRules);
bRules.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
bRules_ActionPerformed(evt);
}
});
bExit.setBounds(24, 272, 65, 25);
bExit.setText("Exit");
bExit.setMargin(new Insets(2, 2, 2, 2));
cp.add(bExit);
bExit.addActionListener(new ActionListener()
{
public void actionPerformed(ActionEvent evt)
{
bExit_ActionPerformed(evt);
}
});
jIP.setBounds(360, 24, 59, 25);
jIP.setText("IP:");
cp.add(jIP);
jNickname.setBounds(245, 24, 59, 25);
jNickname.setText("Nickname");
cp.add(jNickname);
jPort.setBounds(360, 56, 67, 25);
jPort.setText("Port:");
cp.add(jPort);
jtIP.setBounds(392, 24, 97, 25);
jtIP.setText("IP eingeben");
cp.add(jtIP);
jtIP.addFocusListener(new java.awt.event.FocusAdapter()
{
public void focusGained(java.awt.event.FocusEvent evt)
{
if(jtIP.getText().equals("IP eingeben"))
jtIP.setText("");
}
});
jtNick.setBounds(245, 56, 97, 25);
jtNick.setText("Nick eingeben");
cp.add(jtNick);
jtNick.addFocusListener(new java.awt.event.FocusAdapter()
{
public void focusGained(java.awt.event.FocusEvent evt)
{
if(jtNick.getText().equals("Nick eingeben"))
jtNick.setText("");
}
});
jtPort.setBounds(392, 56, 97, 25);
jtPort.setText("Port eingeben");
cp.add(jtPort);
jtPort.addFocusListener(new java.awt.event.FocusAdapter()
{
public void focusGained(java.awt.event.FocusEvent evt)
{
if(jtPort.getText().equals("Port eingeben"))
jtPort.setText("");
}
});
jspjtaLog.setBounds(192, 165, 275, 134);
jtaLog.setText("\n");
jspjtaLog.setViewportView(jtaLog);
jtaLog.setEditable(false);
cp.add(jspjtaLog);
// Ende Komponenten
b = false;
} // end of public GUIClient
// Anfang Methoden
public void bconnect_ActionPerformed(ActionEvent evt)
{
if (b == false)
{
if(jtNick.getText() != "")
{
bconnect.setText("Von Server trennen...");
ec = new EchoClient(jtIP.getText(), Integer.parseInt(jtPort.getText()), jtaLog, this);
ec.send("ANMELDUNG " + jtNick.getText());
bPapier.setEnabled(true);
bSchere.setEnabled(true);
bStein.setEnabled(true);
bEchse.setEnabled(true);
bSpock.setEnabled(true);
b = true;
}
else
{
jtaLog.setText("Bitte gebe einen gültigen Namen ein.");
}
}
else
{
bconnect.setText("Mit Server verbinden...");
ec.send("ABMELDUNG");
bPapier.setEnabled(false);
bSchere.setEnabled(false);
bStein.setEnabled(false);
bEchse.setEnabled(false);
bSpock.setEnabled(false);
b = false;
}
} // end of bconnect_ActionPerformed
public void bEchse_ActionPerformed(ActionEvent evt)
{
ec.send("WAHL "+bEchse.getText());
bPapier.setEnabled(false);
bStein.setEnabled(false);
bSchere.setEnabled(false);
bEchse.setEnabled(false);
bSpock.setEnabled(false);
} // end of bSchere_ActionPerformed
public void bPapier_ActionPerformed(ActionEvent evt)
{
ec.send("WAHL "+bPapier.getText());
bStein.setEnabled(false);
bSchere.setEnabled(false);
bPapier.setEnabled(false);
bEchse.setEnabled(false);
bSpock.setEnabled(false);
} // end of bPapier_ActionPerformed
public void bSchere_ActionPerformed(ActionEvent evt)
{
ec.send("WAHL "+bSchere.getText());
bPapier.setEnabled(false);
bStein.setEnabled(false);
bSchere.setEnabled(false);
bEchse.setEnabled(false);
bSpock.setEnabled(false);
} // end of bSchere_ActionPerformed
public void bSpock_ActionPerformed(ActionEvent evt)
{
ec.send("WAHL "+bSpock.getText());
bPapier.setEnabled(false);
bStein.setEnabled(false);
bSchere.setEnabled(false);
bEchse.setEnabled(false);
bSpock.setEnabled(false);
} // end of bSchere_ActionPerformed
public void bStein_ActionPerformed(ActionEvent evt)
{
ec.send("WAHL "+bStein.getText());
bPapier.setEnabled(false);
bSchere.setEnabled(false);
bStein.setEnabled(false);
bEchse.setEnabled(false);
bSpock.setEnabled(false);
} // end of bStein_ActionPerformed
public void bRules_ActionPerformed(ActionEvent evt)
{
ru = new Rules("Regeln");
}
public void bExit_ActionPerformed(ActionEvent evt)
{
System.exit(0);
} // end of bExit_ActionPerformed
// Ende Methoden
public static void main(String[] args)
{
new GUIClient("GUIClient");
} // end of main
} // end of class GUIClient
EchoClient:
Java:
import javax.swing.*;
/**
*
* Beschreibung
*
*/
public class EchoClient extends Client {
// Attribute
GUIClient gc;
JTextArea ausgabe;
public EchoClient(String pServerIP, int pServerPort, JTextArea pAusgabe, GUIClient pgc) {
super(pServerIP, pServerPort);
this.ausgabe = pAusgabe;
this.gc = pgc;
}
// Anfang Ereignisprozeduren
public void processMessage(String pMessage)
{
if (pMessage.startsWith("MSG ")) {
ausgabe.append(pMessage.substring(4)+"\n");
} else {
if (pMessage.startsWith("TRUE ")) {
ausgabe.append("Mit Server verbunden!\n");
} else {
if (pMessage.startsWith("FALSE")) {
ausgabe.append("Konnte keine Verbindung herstellen!\n");
} else {
if (pMessage.startsWith("WAHL ")) {
ausgabe.append("Wahl: "+pMessage.substring(5)+"\n");
} else {
if (pMessage.startsWith("NAME?")) {
ausgabe.append("Du wirst nach deinem Namen gefragt\n");
}
else {
if(pMessage.startsWith("NEU"))
{
gc.jtaLog.setText("");
ausgabe.append("Neues Spiel \n");
gc.bSchere.setEnabled(true);
gc.bStein.setEnabled(true);
gc.bPapier.setEnabled(true);
}
else {
ausgabe.append(pMessage+"\n");
}
}
}
}
}
}
}
}
// Ende Ereignisprozeduren
Client
Java:
public abstract class Client
{
//Objektbeziehungen
private Connection hatVerbindung;
private Clientempfaenger hatEmpfaenger;
/**
Hilfsklasse fuer den Client, die in einem eigenen Thread den Empfang einer Nachricht vom Server realisiert.
@author Horst Hildebrecht
@version 1.0 vom 15.06.2006
*/
class Clientempfaenger extends Thread
{
// Objekte
private Client kenntClient;
private Connection kenntVerbindung;
// Attribute
private boolean zVerbindungAktiv;
/**
Der ClientEmpfaenger hat den zugehörigen Client und die zugehörige Connection kennen gelernt.<br>
@param pClient zugehöriger Client, der die einkommenden Nachrichten bearbeitet
@param pConnection zugehörige Connection, die die einkommenden Nachrichten empfŠngt
*/
public Clientempfaenger(Client pClient, Connection pConnection)
{
kenntClient = pClient;
kenntVerbindung = pConnection;
zVerbindungAktiv = true;
}
/**
Solange der Server Nachrichten sendete, wurden diese empfangen und an die ClientVerbinedung weitergereicht.
*/
public void run()
{
String lNachricht;
boolean lNachrichtEmpfangen = true;
do
if (zVerbindungAktiv)
{
lNachricht = kenntVerbindung.receive();
lNachrichtEmpfangen = (lNachricht != null);
if (lNachrichtEmpfangen)
kenntClient.processMessage(lNachricht);
}
while (zVerbindungAktiv && lNachrichtEmpfangen);
}
/**
Der ClientEmpfaenger arbeitet nicht mehr
*/
public void gibFrei()
{
zVerbindungAktiv = false;
}
}
/**
Der Client ist mit Ein- und Ausgabestreams initialisiert.<br>
@param pIPAdresse IP-Adresse bzw. Domain des Servers
@param pPortNr Portnummer des Sockets
*/
public Client(String pIPAdresse, int pPortNr)
{
hatVerbindung = new Connection(pIPAdresse, pPortNr);
try
{
hatEmpfaenger = new Clientempfaenger(this, hatVerbindung);
hatEmpfaenger.start();
}
catch (Exception pFehler)
{
System.err.println("Fehler beim \u00D6ffnen des Clients: " + pFehler);
}
}
public void send(String pMessage)
{
hatVerbindung.send(pMessage);
}
public String toString()
{
return "Verbindung mit Socket: " + hatVerbindung.verbindungsSocket();
}
/**
Eine Nachricht vom Server wurde bearbeitet.<br>
Diese abstrakte Methode muss in Unterklassen überschrieben werden.
@param pNachricht die empfangene Nachricht, die bearbeitet werden soll
*/
public abstract void processMessage(String pMessage);
/**
Die Verbindung wurde mit Ein- und Ausgabestreams geschlossen.
*/
public void close()
{
if (hatEmpfaenger != null)
hatEmpfaenger.gibFrei();
hatEmpfaenger = null;
hatVerbindung.close();
}
}
Connection
Java:
import java.io.*;
import java.net.*;
public class Connection extends Thread
{
private class PrintlnStream extends PrintStream
{
public PrintlnStream(OutputStream out, boolean autoflush)
{
super(out, autoflush);
}
public void println (String s)
{
this.print(s + "\r\n");
}
public void println ()
{
this.print("\r\n");
}
}
//Objektbeziehungen
private Socket hatSocket; // Besser wŠre eine Unterklasse. Wegen des noetigen super-Aufrufs in try nicht moeglich!
private BufferedReader hatEingabe;
private PrintlnStream hatAusgabe;
// Attribute
protected boolean zVerbindungAktiv; // Nur fŸr Unterklassen, die echte Threads sind (ServerVerbindung)
private String zPartnerAdresse;
private int zPartnerPort;
protected Connection(){} // nur aus formalen Gruenden noetig
/**
Die Verbindung ist mit Ein- und Ausgabestreams initialisiert.
@param pSocket Socket, der die Verbindung beschreibt
@param pTestModus Wenn true, werden bei jeder Operation Meldungen auf der Konsole ausgegeben.
*/
protected Connection(Socket pSocket)
{
this.erstelleVerbindung(pSocket);
}
/**
Die Verbindung ist mit Ein- und Ausgabestreams initialisiert.
@param pIPAdresse IP-Adresse bzw. Domain des Partners
@param pPortNr Portnummer des Sockets
*/
public Connection(String pIPAdresse, int pPortNr)
{
try
{
this.erstelleVerbindung(new Socket(pIPAdresse, pPortNr));
}
catch (Exception pFehler)
{
hatSocket = null;
System.err.println("Fehler beim \u00D6ffnen von Socket: " + pFehler);
}
}
/**
Die Verbindung ist mit Ein- und Ausgabestreams initialisiert.
@param pSocket Socket, der die Verbindung beschreibt
*/
protected void erstelleVerbindung(Socket pSocket)
{
hatSocket = pSocket;
zVerbindungAktiv = true;
try
{
// Den Eingabe- und Ausgabestream holen
hatEingabe = new BufferedReader(new InputStreamReader(hatSocket.getInputStream()));
hatAusgabe = new PrintlnStream(hatSocket.getOutputStream(), true);
zPartnerAdresse = this.verbindungsSocket().getInetAddress().toString();
zPartnerAdresse = zPartnerAdresse.substring(zPartnerAdresse.indexOf('/') + 1);
zPartnerPort = this.verbindungsSocket().getPort();
}
catch (Exception pFehler)
{
System.err.println("Fehler beim Erzeugen der Streams der Verbindung: " + pFehler);
}
}
public String toString()
{
return "Verbindung mit Socket: " + hatSocket;
}
/**
Ein Text wurde in den Ausgabestream geschrieben.
@param pNachricht Text, der geschrieben werden soll
*/
public void send(String pMessage)
{
try
{
hatAusgabe.println(pMessage);
}
catch (Exception pFehler)
{
System.err.println("Fehler beim Schreiben in der Verbindung: " + pFehler);
}
}
/**
Ein Text des Eingabestreams wurde geliefert.
*/
public String receive()
{
String lEingabe = null;
try
{
lEingabe = hatEingabe.readLine();
}
catch (Exception pFehler)
{
if (zVerbindungAktiv)
System.err.println("Fehler beim Lesen in der Verbindung: " + pFehler);
}
return lEingabe;
}
/**
Die IP-Nummer des Partners wurde geliefert.
*/
protected String partnerAdresse()
{
return zPartnerAdresse;
}
/**
Der Port des Partners wurde geliefert.
*/
protected int partnerPort()
{
return zPartnerPort;
}
/**
Der Socket der Verbindung wurde geliefert.
*/
protected Socket verbindungsSocket()
{
return hatSocket;
}
/**
Die Verbindung wurde mit Ein- und Ausgabestreams geschlossen.
*/
public void close()
{
zVerbindungAktiv = false;
try
{
// Die Streams und den Socket schliessen
hatEingabe.close(); hatEingabe = null;
hatAusgabe.close(); hatAusgabe = null;
hatSocket.close(); hatSocket = null;
}
catch (Exception pFehler)
{
System.err.println("Fehler beim Schlie\u00DFen der Verbindung: " + pFehler);
}
}
}