feat: F4.6g1 the echo server and the generic client windows

Oracle EchoWindowRun uses Java's echo server and client windows as a
person does; SaveAfterRunRun echo saves what Java keeps after the run.
The room takes setActive with a port, connect/disconnect/send, sends
both views and writes the server's port and the client's target back.
The editor's windows show Java's buttons, fields and lines; a port that
is no port is marked and not handed over (Java's button throws).
Core fix: an empty message (one empty segment with the push, as Java's
erstelleSegmente makes) counted as a repeat and never arrived.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-10-03 20:04:33 +00:00
co-authored by Claude Opus 5.5
parent 3dc2713f81
commit e31da62ae0
24 changed files with 1481 additions and 18 deletions
@@ -18,11 +18,17 @@
// domain set to senior.org
// dhcp einfaches_rechnernetz_komplett: the notebooks get their
// addresses from the server (10 s)
// echo email_komplett, with FILIUS' echo server installed on Rechner 2
// and its client on Rechner 1 before the start: the server on port
// 7777 (as its window sets it), the client connected to it, a
// message sent, the client left connected
import filius.gui.GUIContainer;
import filius.gui.netzwerksicht.GUIKnotenItem;
import filius.hardware.knoten.Knoten;
import filius.rahmenprogramm.SzenarioVerwaltung;
import filius.software.clientserver.ClientBaustein;
import filius.software.clientserver.ServerBaustein;
import filius.software.email.Email;
import filius.software.email.EmailAnwendung;
import filius.software.email.EmailKonto;
@@ -93,6 +99,10 @@ public class SaveAfterRunRun {
if (story.equals("email")) {
((Betriebssystem) system("Rechner 1")).installAndStartAppIfAvailable("filius.software.lokal.Terminal");
}
if (story.equals("echo")) {
((Betriebssystem) system("Rechner 2")).installAndStartAppIfAvailable("filius.software.clientserver.ServerBaustein");
((Betriebssystem) system("Rechner 1")).installAndStartAppIfAvailable("filius.software.clientserver.ClientBaustein");
}
network.start();
Thread.sleep(2000);
switch (story) {
@@ -130,6 +140,22 @@ public class SaveAfterRunRun {
case "dhcp":
Thread.sleep(10000);
break;
case "echo": {
// GUIApplicationServerBausteinWindow's start button, then its client's "Verbinden" and "Senden".
ServerBaustein server = (ServerBaustein) system("Rechner 2").holeSoftware("filius.software.clientserver.ServerBaustein");
server.setPort(7777);
server.setAktiv(true);
server.setPort(7777);
Thread.sleep(1000);
ClientBaustein client = (ClientBaustein) system("Rechner 1").holeSoftware("filius.software.clientserver.ClientBaustein");
client.setZielIPAdresse(system("Rechner 2").primaryIPAdresse());
client.setZielPort(7777);
client.verbinden();
Thread.sleep(6000);
client.senden("Hallo");
Thread.sleep(4000);
break;
}
default:
throw new IllegalArgumentException("unknown story " + story);
}