Java 'SyncServer' erlaubt zwei Benutzern gleichzeitig eine Stringvariable zu bearbeiten

8

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%     
Olehi 30.01.2016, 13:59
quelle

2 Antworten

5

Dies bezieht sich nicht primär auf static -Felder. Dein Fehler liegt in dieser Schleife:

%Vor%

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).

    
Andremoniy 30.01.2016, 14:27
quelle
2

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:

entfernen %Vor%

In diesem Fall brauchen Sie synchronized für changeText und appendText überhaupt nicht.

    
Konstantinos Chalkias 30.01.2016 14:22
quelle

Tags und Links