2016-05-03 5 views
0

Ich habe eine Client-Server-Topologie, in der der Client nach einer Liste der Verzeichnisse oder Dateien im aktuellen Arbeitsverzeichnis auf dem Server fragt und der Server mit den entsprechenden Informationen antwortet.Inkonsistente E/A beim Int-Lesen von DataInputStream

Siehe Client-Code

controlSocket.writeByte(LSDIR); 
int dirCount = controlSocket.readInt(); 
Map<String, Long> dirMap = new HashMap<>(); 

for (int i = 0; i < dirCount; i++) { 
    dirMap.put(controlSocket.readString(), controlSocket.readLong()); 
} 

und Servercode

dir = new File(cwd); 
output.writeInt(dir.listFiles(File::isDirectory).length); 

for (File file : dir.listFiles(File::isDirectory)){ 
    output.writeUTF(file.getName()); 
    output.writeLong(file.lastModified()); 
} 

Nun, wenn ich auf dem Server nicht die Verzeichnisliste Angelegenheit ganz gut funktioniert, nicht das Verzeichnis ändern, wie oft ich nenne es. Allerdings, wenn ich cd diesen Client-Code mit

controlSocket.writeByte(CD); 
controlSocket.writeString(path); 

und diesem Server Code

String inputDir = input.readUTF(); 
if (inputDir.equals("..")) { 
    cwd = cwd.substring(0, cwd.lastIndexOf("/")); 
} else { 
    cwd += "/" + inputDir; 
} 

die Verzeichnisliste läuft, aber die ganze Zahl, die aus der Steckdose gelesen wird, ist nicht das, was der Server sendet (ex. Auf der Server, den ich sehe, wird gesendet, aber auf dem Client wird etwas wie 16777216 gelesen). Der Server liest den Inhalt des Verzeichnisses ohne Probleme, daher gibt es kein Problem auf dieser Seite.

Es scheint, als wäre der Daten-I/O-Stream nicht konsistent, sonst verpasse ich etwas. Beachten Sie, dass der Client und der Server auf demselben Computer ausgeführt werden.

+0

Überprüfen Sie Ihre Lese- und Schreibvorgänge. Du versuchst nicht zu implizieren, dass "DataStreams" gebrochen wäre, oder? – Kayaman

+0

Ich habe nur die Reihenfolge überprüft, in der ich lese und schreibe, aber ich bekomme immer noch die falsche Ganzzahl am anderen Ende. Vielleicht ist meine Implementierung der DataStreams falsch, oder ich habe ein Arrangement gefunden, in dem sie kaputt gehen. – Dreadlockyx

+0

Was ist 'readString()'? Was ist denn "controlSocket"? Daten, die mit 'writeUTF()' geschrieben wurden, müssen mit 'readUTF()' gelesen werden. – EJP

Antwort

0

Das Problem war, dass der Server eine zusätzliche Bestätigung boolean nach dem Ändern des Verzeichnisses schrieb, die vom Client als die ganze Zahl gelesen wurde.

Der Code hier funktioniert also ohne Probleme.

Verwandte Themen