M
Minilulatsch
Neues Mitglied
- 0
Hallo Leute,
ich programmiere im Moment eine App, die unter anderem auch Bilder zwischen einem Server und einem Client austauschen soll. Bevor ich zum eigentlichen Problem komme, erzähle ich erstmal etwas über die Funktionsweise.
Also auf einem Rechner läuft eine Server-Anwendung (in Java geschrieben). Dabei handelt es sich um einen Multithreaded-Server der über SSL verschlüsselt. Für jede eingehende Verbindung wird also ein neuer Thread gestartet und ein DataInputStream und ein DataOutputStream angelegt. Der Server hat nun ein Bild in einer Datenbank gespeichert, welches er ausliest und mit folgender Funktion an den Client schickt (wobei os der DataOutputStream)
Damit wird das Bitmap also in gleichmäßigen Paketen verschickt. Der Client empfängt diese Bild folgendermaßen
Jetzt ist es so, dass das bei Tests zwischen dem Server und der App auf einem Emulator mit Android 7 (API 24) auch problemlos funktioniert, das Bild das in der Datenbank gespeichert ist wird so wie es sein soll beim Client angezeigt. Sobald ich aber einen Emulator mit z.B. Android 4.4.2 (API 19, aber auch jede darunter) verwende, werden die Bytes nicht mehr richtig eingelesen. Im Debugger sehe ich, dass das erste Byte in image[] noch das richtige ist, danach folgen nur noch Nullen (Am Server wurde nichts verändert, das Problem ist durch einfaches wechseln der benutzten API beliebig reproduzierbar). Irgendwas muss also beim Lesen des InputStreams schief gehen, aber leider habe ich keine Ahnung was. Ergänzt wird das ganze Verhalten durch ein weiteres Phänomen.
Normalerweise rufe ich die sendBitmapBytes- und die receiveImage-Funktionen mit einer packetSize von 2048 auf. Was bei API 24 funktioniert, führt dann bei API 19 zum genannten Fehler. Sobald ich die packetSize aber auf 1 reduziere, funktioniert der Bild-Transfer auf einmal auch mit API 19, jedes einzelne Byte kommt an wie es soll. Auch hier frage ich mich: Warum? Denn bei API 24 funktioniert es auch mit 2048 Bytes pro Transfer. Und die packetSize auf 1 reduzieren kann eigentlich auch nicht die Lösung sein, da jedes Byte einzeln versenden und empfangen da eher nicht der richtige Weg ist, oder?
Ich hoffe ihr könnt mir bei meinem Problem helfen, ich kann leider gar nichts sinnvolles daraus schließen, vielleicht bin ich aber auch vor lauter Rumprobieren so blind, das ich irgendwas essenzielles übersehe.
Falls ich irgendwelche Infos vergessen habe, reiche ich die natürlich gerne nach.
Vielen Dank schonmal und Lg
Minilulatsch
ich programmiere im Moment eine App, die unter anderem auch Bilder zwischen einem Server und einem Client austauschen soll. Bevor ich zum eigentlichen Problem komme, erzähle ich erstmal etwas über die Funktionsweise.
Also auf einem Rechner läuft eine Server-Anwendung (in Java geschrieben). Dabei handelt es sich um einen Multithreaded-Server der über SSL verschlüsselt. Für jede eingehende Verbindung wird also ein neuer Thread gestartet und ein DataInputStream und ein DataOutputStream angelegt. Der Server hat nun ein Bild in einer Datenbank gespeichert, welches er ausliest und mit folgender Funktion an den Client schickt (wobei os der DataOutputStream)
Code:
private void sendBitmapBytes(byte[] imageBytes, int packetSize) {
try {
os.writeInt(imageBytes.length);
os.flush();
int packets = (imageBytes.length-(imageBytes.length%packetSize))/packetSize;
int rest = imageBytes.length%packetSize;
for(int i = 0; i < packets*packetSize;i+=packetSize) {
os.write(imageBytes,i,packetSize);
os.flush();
}
os.write(imageBytes, imageBytes.length-rest,rest);
os.flush();
} catch (IOException e) {
e.printStackTrace();
}
}
Damit wird das Bitmap also in gleichmäßigen Paketen verschickt. Der Client empfängt diese Bild folgendermaßen
Code:
public static Bitmap receiveImage(DataInputStream is, int packetSize) {
try {
int size = is.readInt();
if(size != 0) {
byte image[] = new byte[size];
int packets = (size-(size%packetSize))/packetSize;
int rest = size%packetSize;
for (int i = 0; i < packets*packetSize; i+=packetSize) {
is.read(image, i, packetSize);
}
is.read(image, size-rest,rest);
return (BitmapFactory.decodeByteArray(image, 0, image.length));
} else {
return null;
}
} catch (IOException e) {
e.printStackTrace();
return null;
}
}
Jetzt ist es so, dass das bei Tests zwischen dem Server und der App auf einem Emulator mit Android 7 (API 24) auch problemlos funktioniert, das Bild das in der Datenbank gespeichert ist wird so wie es sein soll beim Client angezeigt. Sobald ich aber einen Emulator mit z.B. Android 4.4.2 (API 19, aber auch jede darunter) verwende, werden die Bytes nicht mehr richtig eingelesen. Im Debugger sehe ich, dass das erste Byte in image[] noch das richtige ist, danach folgen nur noch Nullen (Am Server wurde nichts verändert, das Problem ist durch einfaches wechseln der benutzten API beliebig reproduzierbar). Irgendwas muss also beim Lesen des InputStreams schief gehen, aber leider habe ich keine Ahnung was. Ergänzt wird das ganze Verhalten durch ein weiteres Phänomen.
Normalerweise rufe ich die sendBitmapBytes- und die receiveImage-Funktionen mit einer packetSize von 2048 auf. Was bei API 24 funktioniert, führt dann bei API 19 zum genannten Fehler. Sobald ich die packetSize aber auf 1 reduziere, funktioniert der Bild-Transfer auf einmal auch mit API 19, jedes einzelne Byte kommt an wie es soll. Auch hier frage ich mich: Warum? Denn bei API 24 funktioniert es auch mit 2048 Bytes pro Transfer. Und die packetSize auf 1 reduzieren kann eigentlich auch nicht die Lösung sein, da jedes Byte einzeln versenden und empfangen da eher nicht der richtige Weg ist, oder?
Ich hoffe ihr könnt mir bei meinem Problem helfen, ich kann leider gar nichts sinnvolles daraus schließen, vielleicht bin ich aber auch vor lauter Rumprobieren so blind, das ich irgendwas essenzielles übersehe.
Falls ich irgendwelche Infos vergessen habe, reiche ich die natürlich gerne nach.
Vielen Dank schonmal und Lg
Minilulatsch