ajout algo glouton + filius
This commit is contained in:
212
reseau/filius/filius-1.12.5/tmpl/quelltext_vorlagen/client.txt
Normal file
212
reseau/filius/filius-1.12.5/tmpl/quelltext_vorlagen/client.txt
Normal file
@@ -0,0 +1,212 @@
|
||||
/*
|
||||
** This file is part of Filius, a network construction and simulation software.
|
||||
**
|
||||
** Originally created at the University of Siegen, Institute "Didactics of
|
||||
** Informatics and E-Learning" by a students' project group:
|
||||
** members (2006-2007):
|
||||
** André Asschoff, Johannes Bade, Carsten Dittich, Thomas Gerding,
|
||||
** Nadja Haßler, Ernst Johannes Klebert, Michell Weyer
|
||||
** supervisors:
|
||||
** Stefan Freischlad (maintainer until 2009), Peer Stechert
|
||||
** Project is maintained since 2010 by Christian Eibl <filius@c.fameibl.de>
|
||||
** and Stefan Freischlad
|
||||
** Filius 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 2 of the License, or
|
||||
** (at your option) version 3.
|
||||
**
|
||||
** Filius 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 Filius. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package filius.software.clientserver;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import filius.rahmenprogramm.I18n;
|
||||
import filius.software.transportschicht.TCPSocket;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* In dieser Klasse wird das Client-Programm einer einfachen Client-Server-Anwendung implementiert. Nachrichten an die
|
||||
* graphische Benutzungsoberflaeche werden durch den Aufruf banachrichtigeBeobachter(Object) versendet.
|
||||
* </p>
|
||||
* <p>
|
||||
* Aufrufe folgender Methoden des Sockets blockieren:
|
||||
* </p>
|
||||
* <ul>
|
||||
* <li>verbinden()</li>
|
||||
* <li>senden()</li>
|
||||
* <li>empfangen()</li>
|
||||
* <li>schliessen()</li>
|
||||
* </ul>
|
||||
* <p>
|
||||
* Deshalb muessen Methoden dieser Klasse, die Aufrufe dieser Methoden enthalten, ueber die Methode
|
||||
* <code>ausfuehren(String, Object[])</code> aufgerufen werden. Das bewirkt, dass diese Methoden in einem eigenen Thread
|
||||
* ausgefuehrt werden und damit der aufrufende Thread nicht blockiert. Das ist wichtig, wenn die Aufrufe von der
|
||||
* graphischen Benutzungsoberflaeche ausgeloest werden.
|
||||
* </p>
|
||||
* <p>
|
||||
* Ein Beispiel fuer die Verwendung von <code>ausfuehren()</code> ist folgendes: <br />
|
||||
* <code> public void verbinden(String zielAdresse, Integer port) { <br />
|
||||
* Object[] args; <br /> <br />
|
||||
* args = new Object[2]; <br />
|
||||
* args[0] = zielAdresse; <br />
|
||||
* args[1] = port; <br /> <br />
|
||||
* ausfuehren("initialisiereSocket", args); <br />
|
||||
* }
|
||||
* </p>
|
||||
* <p>
|
||||
* Dabei wird als erstes Argument der auszufuehrenden blockierenden Methode
|
||||
* uebergeben (hier: <code> initialisiereSocket</code>) und dann in einem Array die zu uebergebenden Parameter (hier:
|
||||
* <code>zielAdresse</code> und <code>port</code>). Der Aufruf der Methode <code>verbinden(zielAdresse, port)
|
||||
* </code> bewirkt also das Ausfuehren der Methode <code>initialisiereSocket(zielAdresse, port)</code> in einem anderen
|
||||
* Thread. Damit blockiert die Methode <code>verbinden</code> nicht.
|
||||
* </p>
|
||||
* <p>
|
||||
* <b> Achtung:</b> Die indirekt aufgerufene Methode (d. h. ueber <code>
|
||||
* ausfuehren(String, Object[])</code>) muss als <code>public</code> deklariert sein!
|
||||
* </p>
|
||||
*/
|
||||
public class ClientBaustein extends ClientAnwendung implements I18n {
|
||||
private static Logger LOG = LoggerFactory.getLogger(ClientBaustein.class);
|
||||
|
||||
/** Port-Nummer des Servers, an dem Verbindungsanfragen angenommen werden */
|
||||
private int zielPort = 55555;
|
||||
|
||||
/**
|
||||
* Adresse des Rechners, auf dem der Server laeuft als Domainname oder IP-Adresse.
|
||||
*/
|
||||
private String zielIPAdresse;
|
||||
|
||||
/**
|
||||
* Methode zum Verbindungsaufbau zu einem Server. Hier wird der Client-Socket als TCP/IP-Socket erzeugt. Wenn UDP
|
||||
* verwendet werden soll, muss diese Methode ueberschrieben werden. <br />
|
||||
* Diese Methode ist <b>nicht blockierend</b>. Diese Methode veranlasst den Aufruf von
|
||||
* <code>initialisiereSocket</code> in einem anderen Thread.
|
||||
*/
|
||||
public void verbinden() {
|
||||
LOG.debug("INVOKED (" + this.hashCode() + ", T" + this.getId() + ") " + getClass()
|
||||
+ " (ClientBaustein), verbinden()");
|
||||
Object[] args;
|
||||
|
||||
args = new Object[2];
|
||||
args[0] = zielIPAdresse;
|
||||
args[1] = Integer.valueOf(zielPort);
|
||||
|
||||
ausfuehren("initialisiereSocket", args);
|
||||
ausfuehren("empfangeNachricht", null);
|
||||
}
|
||||
|
||||
/**
|
||||
* Methode zum Aufbau einer Verbindung mit einem TCP-Socket. Diese Methode ist blockierend.
|
||||
*/
|
||||
public synchronized void initialisiereSocket(String zielAdresse, Integer port) {
|
||||
LOG.debug("INVOKED (" + this.hashCode() + ", T" + this.getId() + ") " + getClass()
|
||||
+ " (ClientBaustein), initialisiereSocket(" + zielAdresse + "," + port + ")");
|
||||
if (!istVerbunden()) {
|
||||
try {
|
||||
socket = new TCPSocket(getSystemSoftware(), zielAdresse, port);
|
||||
socket.verbinden();
|
||||
|
||||
benachrichtigeBeobachter(messages.getString("sw_clientbaustein_msg2"));
|
||||
} catch (Exception e) {
|
||||
LOG.debug("", e);
|
||||
socket = null;
|
||||
benachrichtigeBeobachter(messages.getString("sw_clientbaustein_msg1") + e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Methode zum trennen einer Verbindung. Der Socket wird durch den Aufruf der Methode schliessen() geschlossen und
|
||||
* und der Socket fuer diese Anwendung auf null gesetzt. <br />
|
||||
* Diese Methode ist <b> blockierend</b>.
|
||||
*/
|
||||
public void trennen() {
|
||||
LOG.debug("INVOKED (" + this.hashCode() + ", T" + this.getId() + ") " + getClass()
|
||||
+ " (ClientBaustein), trennen()");
|
||||
if (socket != null) {
|
||||
socket.schliessen();
|
||||
socket = null;
|
||||
benachrichtigeBeobachter(messages.getString("sw_clientbaustein_msg3"));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Diese Methode <b>blockiert</b> bis die Nachricht versand wurde. Der Empfang der Antwort erfolgt asynchron.
|
||||
*/
|
||||
public void senden(String nachricht) {
|
||||
LOG.debug("INVOKED (" + this.hashCode() + ", T" + this.getId() + ") " + getClass()
|
||||
+ " (ClientBaustein), versendeNachricht(" + nachricht + ")");
|
||||
|
||||
if (socket != null && socket.istVerbunden()) {
|
||||
try {
|
||||
socket.senden(nachricht);
|
||||
benachrichtigeBeobachter("<<" + nachricht);
|
||||
} catch (Exception e) {
|
||||
benachrichtigeBeobachter(e.getMessage());
|
||||
LOG.debug("", e);
|
||||
}
|
||||
} else {
|
||||
benachrichtigeBeobachter(messages.getString("sw_clientbaustein_msg4"));
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Methode zum Empfang einer Nachricht vom Socket. Die empfangene Nachricht wird mit
|
||||
* <code>benachrichtigeBeobachter</code> an die GUI weiter gegeben. Diese Methode ist blockierend und sollte nicht
|
||||
* direkt von der GUI aufgerufen werden.
|
||||
*/
|
||||
public void empfangeNachricht() {
|
||||
LOG.debug("INVOKED (" + this.hashCode() + ", T" + this.getId() + ") " + getClass()
|
||||
+ " (ClientBaustein), empfangeNachricht()");
|
||||
String nachricht;
|
||||
|
||||
while (socket != null && socket.istVerbunden()) {
|
||||
try {
|
||||
nachricht = socket.empfangen(Long.MAX_VALUE);
|
||||
if (nachricht != null) {
|
||||
benachrichtigeBeobachter(">>" + nachricht);
|
||||
} else {
|
||||
socket.schliessen();
|
||||
benachrichtigeBeobachter(
|
||||
messages.getString("sw_clientbaustein_msg5") + " " + socket.holeZielIPAdresse() + ":"
|
||||
+ socket.holeZielPort() + " " + messages.getString("sw_clientbaustein_msg6"));
|
||||
}
|
||||
} catch (Exception e) {
|
||||
benachrichtigeBeobachter(e.getMessage());
|
||||
LOG.debug("", e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/** Methode fuer den Zugriff auf die Server-Adresse */
|
||||
public String getZielIPAdresse() {
|
||||
return zielIPAdresse;
|
||||
}
|
||||
|
||||
/** Methode fuer den Zugriff auf die Server-Adresse */
|
||||
public void setZielIPAdresse(String zielIPAdresse) {
|
||||
this.zielIPAdresse = zielIPAdresse;
|
||||
}
|
||||
|
||||
/**
|
||||
* Methode fuer den Zugriff auf die Port-Nummer, an dem der Server zu erreichen ist.
|
||||
*/
|
||||
public int getZielPort() {
|
||||
return zielPort;
|
||||
}
|
||||
|
||||
/**
|
||||
* Methode fuer den Zugriff auf die Port-Nummer, an dem der Server zu erreichen ist.
|
||||
*/
|
||||
public void setZielPort(int zielPort) {
|
||||
this.zielPort = zielPort;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,223 @@
|
||||
/*
|
||||
** This file is part of Filius, a network construction and simulation software.
|
||||
**
|
||||
** Originally created at the University of Siegen, Institute "Didactics of
|
||||
** Informatics and E-Learning" by a students' project group:
|
||||
** members (2006-2007):
|
||||
** André Asschoff, Johannes Bade, Carsten Dittich, Thomas Gerding,
|
||||
** Nadja Haßler, Ernst Johannes Klebert, Michell Weyer
|
||||
** supervisors:
|
||||
** Stefan Freischlad (maintainer until 2009), Peer Stechert
|
||||
** Project is maintained since 2010 by Christian Eibl <filius@c.fameibl.de>
|
||||
** and Stefan Freischlad
|
||||
** Filius 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 2 of the License, or
|
||||
** (at your option) version 3.
|
||||
**
|
||||
** Filius 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 Filius. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package filius.gui.anwendungssicht;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.util.Observable;
|
||||
|
||||
import javax.swing.BorderFactory;
|
||||
import javax.swing.Box;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JTextArea;
|
||||
import javax.swing.JTextField;
|
||||
|
||||
import filius.software.clientserver.ClientBaustein;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Diese Klasse stellt die Benutzungsoberflaeche fuer das Client-Programm einer
|
||||
* einfachen Client-Server-Anwendung zur Verfuegung.
|
||||
* </p>
|
||||
* <p>
|
||||
* Nachrichten von der Anwendung werden nach dem Beobachtermuster durch die
|
||||
* Benachrichtigung der Beobachter angenommen und verarbeitet.
|
||||
* </p>
|
||||
*/
|
||||
public class GUIApplicationClientBausteinWindow extends GUIApplicationWindow {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* Textfeld fuer die Ausgabe gesendeter und empfangener Nachrichten sowie
|
||||
* fuer Fehlermeldungen
|
||||
*/
|
||||
private JTextArea taAusgabe;
|
||||
|
||||
/**
|
||||
* Textfeld fuer die Adresse des Servers, zu dem die Verbindung hergestellt
|
||||
* werden soll
|
||||
*/
|
||||
private JTextField tfServerAdresse;
|
||||
|
||||
/**
|
||||
* Textfeld zur Angabe des TCP-Ports, auf dem der Server auf eingehende
|
||||
* Nachrichten wartet
|
||||
*/
|
||||
private JTextField tfServerPort;
|
||||
|
||||
/** Textbereich zur Eingabe der Nachrichten */
|
||||
private JTextArea taSenden;
|
||||
|
||||
/** Schaltflaeche zum initiieren des Verbindungsaufbaus */
|
||||
private JButton btVerbinden;
|
||||
|
||||
/**
|
||||
* Schaltflaeche zum Senden einer zuvor eingegebenen Nachricht
|
||||
*/
|
||||
private JButton btSenden;
|
||||
|
||||
/**
|
||||
* Standard-Konstruktor, der automatisch zur Erzeugung der graphischen
|
||||
* Benutzungsoberflaeche fuer diese Anwendung aufgerufen wird.
|
||||
*/
|
||||
public GUIApplicationClientBausteinWindow(GUIDesktopPanel desktop, String appName) {
|
||||
super(desktop, appName);
|
||||
initialisiereKomponenten();
|
||||
}
|
||||
|
||||
/** Methode zur Initialisierung der graphischen Komponenten */
|
||||
private void initialisiereKomponenten() {
|
||||
JPanel hauptPanel;
|
||||
JScrollPane scrollPane;
|
||||
Box hauptBox;
|
||||
Box hBox;
|
||||
JLabel label;
|
||||
|
||||
hauptPanel = new JPanel(new BorderLayout());
|
||||
|
||||
hauptBox = Box.createVerticalBox();
|
||||
hauptBox.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
|
||||
hauptBox.add(Box.createVerticalStrut(5));
|
||||
|
||||
hBox = Box.createHorizontalBox();
|
||||
label = new JLabel(messages.getString("clientbaustein_msg1"));
|
||||
label.setPreferredSize(new Dimension(140, label.getHeight()));
|
||||
hBox.add(label);
|
||||
|
||||
tfServerAdresse = new JTextField();
|
||||
tfServerAdresse.setPreferredSize(new Dimension(100, 20));
|
||||
hBox.add(tfServerAdresse);
|
||||
hauptBox.add(hBox);
|
||||
hauptBox.add(Box.createVerticalStrut(5));
|
||||
|
||||
hBox = Box.createHorizontalBox();
|
||||
label = new JLabel(messages.getString("clientbaustein_msg2"));
|
||||
label.setPreferredSize(new Dimension(140, label.getHeight()));
|
||||
hBox.add(label);
|
||||
|
||||
tfServerPort = new JTextField();
|
||||
tfServerPort.setPreferredSize(new Dimension(100, 20));
|
||||
hBox.add(tfServerPort);
|
||||
hauptBox.add(hBox);
|
||||
hauptBox.add(Box.createVerticalStrut(5));
|
||||
|
||||
btVerbinden = new JButton(messages.getString("clientbaustein_msg3"));
|
||||
btVerbinden.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
if (e.getActionCommand().equals("verbinden")) {
|
||||
((ClientBaustein) holeAnwendung()).setZielIPAdresse(tfServerAdresse.getText());
|
||||
((ClientBaustein) holeAnwendung()).setZielPort(Integer.parseInt(tfServerPort.getText()));
|
||||
((ClientBaustein) holeAnwendung()).verbinden();
|
||||
} else {
|
||||
((ClientBaustein) holeAnwendung()).trennen();
|
||||
}
|
||||
aktualisieren();
|
||||
}
|
||||
});
|
||||
hauptBox.add(btVerbinden);
|
||||
hauptBox.add(Box.createVerticalStrut(5));
|
||||
|
||||
label = new JLabel(messages.getString("clientbaustein_msg4"));
|
||||
label.setPreferredSize(new Dimension(100, 20));
|
||||
hauptBox.add(label);
|
||||
|
||||
taSenden = new JTextArea();
|
||||
scrollPane = new JScrollPane(taSenden);
|
||||
scrollPane.setPreferredSize(new Dimension(400, 50));
|
||||
hauptBox.add(scrollPane);
|
||||
|
||||
btSenden = new JButton(messages.getString("clientbaustein_msg5"));
|
||||
btSenden.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
((ClientBaustein) holeAnwendung()).senden(taSenden.getText());
|
||||
taSenden.setText("");
|
||||
}
|
||||
});
|
||||
hauptBox.add(btSenden);
|
||||
hauptBox.add(Box.createVerticalStrut(5));
|
||||
|
||||
taAusgabe = new JTextArea();
|
||||
taAusgabe.setEditable(false);
|
||||
scrollPane = new JScrollPane(taAusgabe);
|
||||
scrollPane.setPreferredSize(new Dimension(400, 200));
|
||||
hauptBox.add(scrollPane);
|
||||
hauptBox.add(Box.createVerticalStrut(5));
|
||||
|
||||
hauptPanel.add(hauptBox, BorderLayout.CENTER);
|
||||
|
||||
getContentPane().add(hauptPanel);
|
||||
pack();
|
||||
|
||||
aktualisieren();
|
||||
}
|
||||
|
||||
/**
|
||||
* Methode zum aktualisieren der Komponenten der graphischen
|
||||
* Benutzungsoberflaeche in Abhaengigkeit vom Zustand der Anwendung
|
||||
*/
|
||||
private void aktualisieren() {
|
||||
ClientBaustein client;
|
||||
|
||||
client = (ClientBaustein) holeAnwendung();
|
||||
|
||||
tfServerAdresse.setText(client.getZielIPAdresse());
|
||||
tfServerPort.setText("" + client.getZielPort());
|
||||
if (client.istVerbunden()) {
|
||||
btVerbinden.setText(messages.getString("clientbaustein_msg6"));
|
||||
btVerbinden.setActionCommand("trennen");
|
||||
btSenden.setEnabled(true);
|
||||
|
||||
tfServerAdresse.setEditable(false);
|
||||
tfServerPort.setEditable(false);
|
||||
} else {
|
||||
btVerbinden.setText(messages.getString("clientbaustein_msg3"));
|
||||
btVerbinden.setActionCommand("verbinden");
|
||||
btSenden.setEnabled(false);
|
||||
|
||||
tfServerAdresse.setEditable(true);
|
||||
tfServerPort.setEditable(true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Diese Methode wird automatisch ausgefuehrt, wenn eine Nachricht an den
|
||||
* Beobachter der Anwendung gesendet wird. Der Parameter arg enthaelt die
|
||||
* Nachricht, die von der Anwendung verschickt wurde.
|
||||
*/
|
||||
public void update(Observable o, Object arg) {
|
||||
if (arg != null) {
|
||||
this.taAusgabe.append(arg.toString() + "\n");
|
||||
}
|
||||
|
||||
aktualisieren();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
/*
|
||||
** This file is part of Filius, a network construction and simulation software.
|
||||
**
|
||||
** Originally created at the University of Siegen, Institute "Didactics of
|
||||
** Informatics and E-Learning" by a students' project group:
|
||||
** members (2006-2007):
|
||||
** André Asschoff, Johannes Bade, Carsten Dittich, Thomas Gerding,
|
||||
** Nadja Haßler, Ernst Johannes Klebert, Michell Weyer
|
||||
** supervisors:
|
||||
** Stefan Freischlad (maintainer until 2009), Peer Stechert
|
||||
** Project is maintained since 2010 by Christian Eibl <filius@c.fameibl.de>
|
||||
** and Stefan Freischlad
|
||||
** Filius 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 2 of the License, or
|
||||
** (at your option) version 3.
|
||||
**
|
||||
** Filius 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 Filius. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package filius.software.clientserver;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import filius.software.transportschicht.Socket;
|
||||
import filius.software.transportschicht.TCPSocket;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* In dieser Klasse wird das Server-Programm einer einfachen Client-Server-Anwendung implementiert. Nachrichten an die
|
||||
* graphische Benutzungsoberflaeche werden durch den Aufruf banachrichtigeBeobachter(Object) versendet.
|
||||
* </p>
|
||||
* <p>
|
||||
* In dieser Klasse wird mit einem eigenen Thread der Server-Socket auf eingehende Verbindungen gewartet. Die
|
||||
* Verarbeitung der eingehenden Nachrichten erfolgt durch einen Mitarbeiter, der in der Methode
|
||||
* <code>neuerMitarbeiter(Socket)</code> erzeugt wird.
|
||||
* </p>
|
||||
* <p>
|
||||
* Die Verarbeitung eingehender Nachrichten wird von einem Mitarbeiter uebernommen, der erzeugt wird, sobald eine neue
|
||||
* Verbindungsanfrage vom Server-Socket empfangen wurde.
|
||||
* </p>
|
||||
* <p>
|
||||
* Einstellungen, die in einer Projektdatei gespeichert werden sollen, muessen in dieser Klasse als Attribute verwaltet
|
||||
* werden und mit Getter- und Setter-Methoden zugaenglich sein (z. B. fuer das Attribut <code>int bspAttr</code> mit
|
||||
* <code>
|
||||
* public int getBspAttr()</code> und <code>public void setBspAttr(int)
|
||||
* </code>). Attribute, die in der Mitarbeiterklasse vorhanden sind, werden nicht gespeichert!
|
||||
* </p>
|
||||
* <p>
|
||||
* Das Server-Programm wird durch Aufruf der Methode der Oberklasse <code>setAktiv(boolean)</code> aktiviert bzw.
|
||||
* deaktiviert (d. h. die Verbindungsannahme wird aktiviert bzw. deaktiviert).
|
||||
* </p>
|
||||
*/
|
||||
public class ServerBaustein extends TCPServerAnwendung {
|
||||
private static Logger LOG = LoggerFactory.getLogger(ServerBaustein.class);
|
||||
|
||||
/**
|
||||
* In dieser Methode wird ein neuer Mitarbeiter zur Verarbeitung von eingehenden Nachrichten erzeugt und der Liste
|
||||
* der zu verwaltenden Mitarbeiter hinzugefuegt.
|
||||
*/
|
||||
protected void neuerMitarbeiter(Socket socket) {
|
||||
LOG.debug("INVOKED (" + this.hashCode() + ", T" + this.getId() + ") " + getClass()
|
||||
+ " (ServerBaustein), neuerMitarbeiter(" + socket + ")");
|
||||
ServerMitarbeiter mitarbeiter;
|
||||
|
||||
if (socket instanceof TCPSocket) {
|
||||
mitarbeiter = new ServerBausteinMitarbeiter(this, (TCPSocket) socket);
|
||||
this.mitarbeiter.add(mitarbeiter);
|
||||
mitarbeiter.starten();
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,169 @@
|
||||
/*
|
||||
** This file is part of Filius, a network construction and simulation software.
|
||||
**
|
||||
** Originally created at the University of Siegen, Institute "Didactics of
|
||||
** Informatics and E-Learning" by a students' project group:
|
||||
** members (2006-2007):
|
||||
** André Asschoff, Johannes Bade, Carsten Dittich, Thomas Gerding,
|
||||
** Nadja Haßler, Ernst Johannes Klebert, Michell Weyer
|
||||
** supervisors:
|
||||
** Stefan Freischlad (maintainer until 2009), Peer Stechert
|
||||
** Project is maintained since 2010 by Christian Eibl <filius@c.fameibl.de>
|
||||
** and Stefan Freischlad
|
||||
** Filius 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 2 of the License, or
|
||||
** (at your option) version 3.
|
||||
**
|
||||
** Filius 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 Filius. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package filius.gui.anwendungssicht;
|
||||
|
||||
import java.awt.BorderLayout;
|
||||
import java.awt.Dimension;
|
||||
import java.awt.event.ActionEvent;
|
||||
import java.awt.event.ActionListener;
|
||||
import java.util.Observable;
|
||||
|
||||
import javax.swing.BorderFactory;
|
||||
import javax.swing.Box;
|
||||
import javax.swing.JButton;
|
||||
import javax.swing.JLabel;
|
||||
import javax.swing.JPanel;
|
||||
import javax.swing.JScrollPane;
|
||||
import javax.swing.JTextArea;
|
||||
import javax.swing.JTextField;
|
||||
|
||||
import filius.software.clientserver.ServerAnwendung;
|
||||
import filius.software.clientserver.ServerBaustein;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* Diese Klasse stellt die Benutzungsoberflaeche fuer das Server-Programm einer
|
||||
* einfachen Client-Server-Anwendung zur Verfuegung.
|
||||
* </p>
|
||||
* <p>
|
||||
* Nachrichten von der Anwendung werden nach dem Beobachtermuster durch die
|
||||
* Benachrichtigung der Beobachter angenommen und verarbeitet.
|
||||
* </p>
|
||||
*/
|
||||
public class GUIApplicationServerBausteinWindow extends GUIApplicationWindow {
|
||||
|
||||
private static final long serialVersionUID = 1L;
|
||||
|
||||
/**
|
||||
* Textbereich zur Ausgabe von Log-Daten, die vom Server-Programm erzeugt
|
||||
* und durch Benachrichtigung der Beobachter an die graphische
|
||||
* Benutzungsoberflaeche weiter gegeben werden
|
||||
*/
|
||||
private JTextArea taLog;
|
||||
|
||||
/**
|
||||
* Schaltflaeche zum Starten bzw. Stoppen des Server-Programms, d. h. zum
|
||||
* Starten bzw. Beenden der Verbindungsannahme durch den Server
|
||||
*/
|
||||
private JButton bStartStop;
|
||||
|
||||
/**
|
||||
* Textfeld zur Eingabe des Ports, an dem der Server eingehende
|
||||
* Verbindungsanfragen entgegen nimmt.
|
||||
*/
|
||||
private JTextField tfPort;
|
||||
|
||||
/**
|
||||
* Standard-Konstruktor, der automatisch zur Erzeugung der graphischen
|
||||
* Benutzungsoberflaeche fuer diese Anwendung aufgerufen wird.
|
||||
*/
|
||||
public GUIApplicationServerBausteinWindow(GUIDesktopPanel desktop, String appName) {
|
||||
super(desktop, appName);
|
||||
initialisiereKomponenten();
|
||||
}
|
||||
|
||||
/** Methode zur Initialisierung der graphischen Komponenten */
|
||||
private void initialisiereKomponenten() {
|
||||
JPanel hauptPanel;
|
||||
JScrollPane spLogScroller;
|
||||
JLabel lbPort;
|
||||
Box hBox, vBox;
|
||||
|
||||
hauptPanel = new JPanel(new BorderLayout());
|
||||
vBox = Box.createVerticalBox();
|
||||
vBox.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 2));
|
||||
vBox.add(Box.createVerticalStrut(5));
|
||||
|
||||
hBox = Box.createHorizontalBox();
|
||||
|
||||
bStartStop = new JButton();
|
||||
bStartStop.addActionListener(new ActionListener() {
|
||||
public void actionPerformed(ActionEvent e) {
|
||||
if (e.getActionCommand().equals("start")) {
|
||||
((ServerAnwendung) holeAnwendung()).setPort(Integer.parseInt(tfPort.getText()));
|
||||
((ServerAnwendung) holeAnwendung()).setAktiv(true);
|
||||
((ServerAnwendung) holeAnwendung()).setPort(Integer.parseInt(tfPort.getText()));
|
||||
} else {
|
||||
((ServerAnwendung) holeAnwendung()).setAktiv(false);
|
||||
}
|
||||
aktualisieren();
|
||||
}
|
||||
});
|
||||
hBox.add(bStartStop);
|
||||
hBox.add(Box.createHorizontalStrut(5));
|
||||
|
||||
lbPort = new JLabel(messages.getString("serverbaustein_msg1"));
|
||||
hBox.add(lbPort);
|
||||
tfPort = new JTextField("" + ((ServerAnwendung) holeAnwendung()).getPort());
|
||||
hBox.add(tfPort);
|
||||
|
||||
vBox.add(hBox);
|
||||
vBox.add(Box.createVerticalStrut(5));
|
||||
|
||||
taLog = new JTextArea();
|
||||
taLog.setEditable(false);
|
||||
spLogScroller = new JScrollPane(taLog);
|
||||
spLogScroller.setPreferredSize(new Dimension(400, 400));
|
||||
vBox.add(spLogScroller);
|
||||
vBox.add(Box.createVerticalStrut(5));
|
||||
|
||||
hauptPanel.add(vBox, BorderLayout.CENTER);
|
||||
|
||||
getContentPane().add(hauptPanel);
|
||||
pack();
|
||||
|
||||
aktualisieren();
|
||||
}
|
||||
|
||||
/**
|
||||
* Methode zum aktualisieren der Komponenten der graphischen
|
||||
* Benutzungsoberflaeche in Abhaengigkeit vom Zustand der Anwendung
|
||||
*/
|
||||
public void aktualisieren() {
|
||||
ServerBaustein server;
|
||||
|
||||
server = (ServerBaustein) holeAnwendung();
|
||||
if (server.isAktiv()) {
|
||||
tfPort.setEditable(false);
|
||||
bStartStop.setText(messages.getString("serverbaustein_msg2"));
|
||||
bStartStop.setActionCommand("stop");
|
||||
} else {
|
||||
bStartStop.setText(messages.getString("serverbaustein_msg3"));
|
||||
bStartStop.setActionCommand("start");
|
||||
tfPort.setEditable(true);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Diese Methode wird automatisch ausgefuehrt, wenn der eine Nachricht an
|
||||
* den Beobachter der Anwendung gesendet wird. Der Parameter arg enthaelt
|
||||
* die Nachricht, die von der Anwendung verschickt wurde.
|
||||
*/
|
||||
public void update(Observable o, Object arg) {
|
||||
taLog.append(arg.toString() + "\n");
|
||||
aktualisieren();
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
/*
|
||||
** This file is part of Filius, a network construction and simulation software.
|
||||
**
|
||||
** Originally created at the University of Siegen, Institute "Didactics of
|
||||
** Informatics and E-Learning" by a students' project group:
|
||||
** members (2006-2007):
|
||||
** André Asschoff, Johannes Bade, Carsten Dittich, Thomas Gerding,
|
||||
** Nadja Haßler, Ernst Johannes Klebert, Michell Weyer
|
||||
** supervisors:
|
||||
** Stefan Freischlad (maintainer until 2009), Peer Stechert
|
||||
** Project is maintained since 2010 by Christian Eibl <filius@c.fameibl.de>
|
||||
** and Stefan Freischlad
|
||||
** Filius 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 2 of the License, or
|
||||
** (at your option) version 3.
|
||||
**
|
||||
** Filius 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 Filius. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
package filius.software.clientserver;
|
||||
|
||||
import org.slf4j.Logger;
|
||||
import org.slf4j.LoggerFactory;
|
||||
|
||||
import filius.software.transportschicht.Socket;
|
||||
|
||||
/**
|
||||
* <p>
|
||||
* In dieser Klasse erfolgt die Verarbeitung von eingehenden Nachrichten an einen Server.
|
||||
* </p>
|
||||
* <p>
|
||||
* Die Oberklasse <code>ServerMitarbeiter</code> erbt von der Klasse Thread. In der <code>run()</code>-Methode der
|
||||
* Oberklasse wird der Socket auf eingehende Nachrichten ueberwacht. Sobald eine Nachricht eintrifft, wird diese an die
|
||||
* Methode <code>verarbeiteNachricht(String)</code> zur weiteren Verarbeitung weiter gegeben. Ausserdem wird dort der
|
||||
* Socket automatisch geschlossen, wenn das Client-Programm den Verbindungsabbau initiiert.
|
||||
* </p>
|
||||
* <p>
|
||||
* In dieser Klasse sollte nur die Methode <code>senden(String)</code> des Sockets verwendet werden!
|
||||
* </p>
|
||||
*/
|
||||
public class ServerBausteinMitarbeiter extends ServerMitarbeiter {
|
||||
private static Logger LOG = LoggerFactory.getLogger(ServerBausteinMitarbeiter.class);
|
||||
|
||||
/**
|
||||
* Standard-Konstruktor. Wenn der Server auf einem bestimmten Port auf eingehende Verbindungen warten soll, muss die
|
||||
* Port-Nummer hier mit <code>setPort(int)</code> initialisiert werden!
|
||||
*/
|
||||
public ServerBausteinMitarbeiter(ServerAnwendung server, Socket socket) {
|
||||
super(server, socket);
|
||||
}
|
||||
|
||||
/**
|
||||
* Methode, die automatisch aufgerufen wird, wenn eine neue Nachricht eintrifft. Hier erfolgt die Verarbeitung der
|
||||
* eingehenden Nachricht.
|
||||
*/
|
||||
protected void verarbeiteNachricht(String nachricht) {
|
||||
LOG.debug("INVOKED (" + this.hashCode() + ", T" + this.getId() + ") " + getClass()
|
||||
+ " (ServerBausteinMitarbeiter), verarbeiteNachricht(" + nachricht + ")");
|
||||
try {
|
||||
socket.senden(nachricht);
|
||||
server.benachrichtigeBeobachter("<<" + nachricht);
|
||||
} catch (Exception e) {
|
||||
LOG.debug("", e);
|
||||
server.benachrichtigeBeobachter(e.getMessage());
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user