Ich verwende Javas BufferedInputStream
Klasse, um Bytes an einen Socket gesendet zu lesen. Die Daten an den Socket ist HTTP-Formular, so im Allgemeinen ist ein Header mit definierten Content-Länge, dann einige Inhalte.Socket lesen mit BufferedInputStream
Das Problem, das ich habe, ist, dass manchmal BufferedInputStream.read()
wird nicht die gesamte Menge der Daten an es gesendet. Es gibt die Anzahl der gelesenen Bytes zurück, aber das ist viel weniger als gesendet wurde. Ich habe den gesendeten Bytes mit Wireshark überprüft und kann die vollständige Meldung bestätigen wird übertragen)
Beispielcode unten.
BufferedInputStream inFromClient = new BufferedInputStream(socket.getInputStream());
int contentLength = getContentLengthFromHeader();
byte[] b = new byte[contentLength];
int bytesRead = inFromClient.read(b, 0, contentLength);
einmal gelesen() manchmal bytesRead
beendet ist gleich contentLength
ist aber auch bei anderen Gelegenheiten read() scheint nicht bis zum Ende des Inhalts zu lesen. Hat jemand irgendwelche Ideen, was passiert? Ist Java-Pufferausgabe? Gibt es bessere Möglichkeiten, aus Sockeln zu lesen?
Die 'channelCopy()' Methode der Schleife sollte 'while (src.read (Puffer)> 0 || buffer.position()> 0) .' Sie können dann das Zeug am Ende, das bei EOF endet, loswerden. – EJP
Hallo @ejp, danke fürs kommentieren; Ich nehme an, du hast wahrscheinlich Recht, aber ich verstehe es nicht ganz - kannst du bitte etwas ausarbeiten? Wenn ich das 'while (src.read (buffer)! = -1)' mit dem, was Sie vorschlagen, ersetzen, scheint es mir, dass der Kopiervorgang vorzeitig beendet wird, wenn zum Beispiel eine HTTP-Übertragung vorübergehend anhält (read könnte 0 zurückgeben weil keine neuen Daten verfügbar sind, und wir könnten den Puffer leeren, den wir haben, und ihn auf Position 0 belassen, aber es wäre falsch, die Schleife zu diesem Zeitpunkt zu beenden (weil EOF nicht erreicht wurde) - was fehlt mir hier ? – JVMATL
Sie vermissen den Teil nach dem '|| .' – EJP