ajout algo glouton + filius

This commit is contained in:
2022-05-04 18:39:31 +02:00
parent 8b544dba16
commit 92c5087408
110 changed files with 6166 additions and 0 deletions

View 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 />
* &nbsp;&nbsp; Object[] args; <br /> <br />
* &nbsp;&nbsp; args = new Object[2]; <br />
* &nbsp;&nbsp; args[0] = zielAdresse; <br />
* &nbsp;&nbsp; args[1] = port; <br /> <br />
* &nbsp;&nbsp; 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;
}
}

View File

@@ -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();
}
}

View File

@@ -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();
}
}
}

View File

@@ -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();
}
}

View File

@@ -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());
}
}
}