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.
Überprüfen Sie Ihre Lese- und Schreibvorgänge. Du versuchst nicht zu implizieren, dass "DataStreams" gebrochen wäre, oder? – Kayaman
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
Was ist 'readString()'? Was ist denn "controlSocket"? Daten, die mit 'writeUTF()' geschrieben wurden, müssen mit 'readUTF()' gelesen werden. – EJP