Ich habe ein bisschen Mühe, die Ursache meines Problems zu finden.
Die Funktionalität des Programms ist wie folgt ... die Server
erlaubt mehreren Benutzern sich anzumelden (Verbindung zum Server) und die gleiche Stringvariable namens text
mit den Startbefehlen von rep:
(für Ersetzen Sie die gesamte Zeichenfolge) oder app:
(zum Anhängen an die Zeichenfolge).
Wenn der Client eine Verbindung herstellt, müssen sie einen Befehl eingeben. Was auch immer der Befehl ist, es wird in demselben Fenster zurückgesendet (das gleichzeitig den Server und den Client in verschiedenen CMD-Fenstern ausführt). Wenn sie also hello
eingeben, wäre das Echo ECHO: hello
.
Wenn der eingegebene Befehl rep:tight
ist, sollte die text
string-Variable im Server tight
enthalten und sollte dann im Client-cmd-Fenster als tight
- ohne ECHO zurückgegeben / angezeigt werden .
Wenn der folgende Befehl app:rope
lautet, sollte die text
string-Variable auf dem Server so geändert werden, dass tightrope
enthalten ist und im cmd-Fenster des Clients als tightrope
zurückgegeben / angezeigt werden soll.
Außerdem kann der Benutzer keinen Wert unter 4 Zeichen eingeben, und daher sollte SynchClient eine Fehlermeldung anzeigen und den Benutzer auffordern, einen anderen Wert einzugeben.
Das Problem, das ich habe, ist die Tatsache, dass sich meine Echowerte nicht nach jeder neuen Eingabe ändern. Ich bekomme die Rückkehr des ersten eingegebenen Kommandos und das war's und ich kämpfe darum, alles zu verstehen.
EDIT: Am besten, wenn Sie das Programm selbst ausführen.
Hier ist, wie meine SynchServer.java Datei aussieht:
%Vor%und meine SynchClient.java-Datei:
%Vor%BEARBEITEN 2: Meine Arbeitslösung:
Server:
%Vor%Kunde:
%Vor% Dies bezieht sich nicht primär auf static
-Felder. Dein Fehler liegt in dieser Schleife:
Es läuft unendlich nach der ersten Client-Eingabe und liest nicht jedes Mal einen neuen Wert aus dem Eingabestrom.
Diese Zeilen:
%Vor%sollte in die Schleife eingefügt werden:
%Vor%AKTUALISIEREN :
Um genau zu sein, hat es ein anderes, sekundäres Problem, diese zwei Zeilen:
%Vor%Sie sollten in nur geändert werden:
%Vor%(sonst senden Sie zwei separate Zeilen, was nicht erwünscht ist).
Sie haben einen synchronisierten Block, der für jedes Objekt einzeln gilt, nicht für jedes Objekt, da der synchronisierte Block für Objekte gilt, die nicht die gesamte Klasse sind.
Sie können eine statische Sperre verwenden, so dass alle Clients warten, bis sie an der Reihe sind. Überprüfen Sie diesen Link, um den Vergleich zwischen statischen und nicht statischen Sperren zu sehen
Statisches oder nicht-statisches Sperrobjekt im synchronisierten Block
und das
Wie sperrt man eine Methode für eine ganze Klasse mit synchronisiert?
Sie sollten also static
modifier von text
field deklaration:
In diesem Fall brauchen Sie synchronized
für changeText
und appendText
überhaupt nicht.
Tags und Links java