Bild empfangen über Socket

  • Antworten:70
  • OffenNicht stickyNicht beantwortet
Gelöschter Account
  • Forum-Beiträge: 2.492

24.02.2014, 17:24:18 via Website

Hallo,
ich habe eine Socket Verbindung zwischen Client und Server und Textnachrichten zu versenden klappt. Das Empfangen habe ich so gelöst:
1BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
2String st = null;
3st = input.readLine();
4mClientMsg = st;
5myUpdateHandler.sendMessage(m);

Doch jetzt will ich ein Bild empfangen. Und zwar bekomme ich ein Byte[] und verarbeite das. Aber leider wird dann auf dem Bildschirm nichts angezeigt und es kommt auch kein Fehler:

1InputStream stream = s.getInputStream();
2final byte[] bytes = readFully(stream);
3Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
4ImageView view = new ImageView(MyServer.this);
5view.setImageBitmap(bmp);
6lChat.addView(view);
7
8public static byte[] readFully(InputStream input) throws IOException
9 {
10 byte[] buffer = new byte[8192];
11 int bytesRead;
12 ByteArrayOutputStream output = new ByteArrayOutputStream();
13 while ((bytesRead = input.read(buffer)) != -1)
14 {
15 output.write(buffer, 0, bytesRead);
16 }
17 return output.toByteArray();
18 }

Weiß jemand was ich ändern muss?

Gruß
Lars

— geändert am 24.02.2014, 17:24:58

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.401

24.02.2014, 17:26:18 via Website

Wie sind die Bytes des Bildes denn kodiert?
Wie verschickst du das Bild vom Server?

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

24.02.2014, 17:27:30 via Website

Das ist die Methode zum Versenden des Bildes:
1ByteArrayOutputStream stream = new ByteArrayOutputStream();
2 bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
3 byte[] byteArray = stream.toByteArray();
4 OutputStream os;
5 try {
6 os = MyServer.socket.getOutputStream();
7 os.write(byteArray,0,byteArray.length);
8 os.flush();
9 } catch (IOException e) {
10 // TODO Auto-generated catch block
11 e.printStackTrace();
12 }

— geändert am 24.02.2014, 17:27:50

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.401

24.02.2014, 17:34:32 via Website

Wenn du beim sendenden ByteArrayOutputStream benutzt solltest du beim lesen dem ByteArrayInputStream nehmen

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

24.02.2014, 18:00:17 via Website

Also dann:
ByteArrayInputStream stream = (ByteArrayInputStream) s.getInputStream();
und dann so wie zuvor oder wie meinst du das?

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

24.02.2014, 18:10:13 via Website

Ist das jetzt für das Senden oder für das Empfangen?

Ich dachte OutputStream ist so grob gesagt immer senden und InputStream ist empfangen.

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

24.02.2014, 21:40:11 via Website

Ich verstehe jetzt nicht was du meinst.
Das Bild müsste doch eigentlich als Byte[] schon übergekommen sein und muss jetzt nur noch wieder zu einem Bild gemacht werden oder?

Edit: wenn ich das compress in ne if Abfrage stecke sagt er mir das true zurückkommt also heißt das das das Bild richtig komprimiert werden kann also liegt der Fehler beim Empfänger oder?

— geändert am 24.02.2014, 21:43:45

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.401

24.02.2014, 21:51:03 via App

Genau, du musst beim Empfänger die Bytes wieder dekomprimieren und in ein Bmp laden

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

24.02.2014, 21:58:49 via Website

Okay und genau da weiß ich nicht weiter, weil kein Bild angezeigt wird

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.401

24.02.2014, 23:34:16 via App

Dann musst du die einzelnen Bytes vergleichen, ob sie auch alle richtig empfangen werden. Sonst musst du nen anderen inputstream etc. nehmen

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

25.02.2014, 16:45:27 via Website

Hab versucht die Bytes zu loggen aber wird nichts in der Logcat angezeigt

Hab jetzt so gesendet:
[code]
ByteArrayOutputStream stream = new ByteArrayOutputStream();
bmp.compress(Bitmap.CompressFormat.PNG, 100, stream);
byte[] byteArray = stream.toByteArray();
OutputStream os;
try {
os = MyClient.socket.getOutputStream();
os.write(byteArray,0,byteArray.length);
for(int i = 0; i < byteArray.length; i++){
Log.d("i", ""+byteArray[i]);
}
os.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
[/code]

Und so versucht zu empfangen:
1if (s == null){
2 s = ss.accept();
3 }
4 BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
5
6 InputStream stream = s.getInputStream();
7 final byte[] bytes = readFully(stream);
8 Bitmap bmp = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
9 ImageView view = new ImageView(MyServer.this);
10 view.setImageBitmap(bmp);
11 lChat.addView(view);
12
13 String st = null;
14 st = input.readLine();
15 mClientMsg = st;//mybytearray2.toString()
16 myUpdateHandler.sendMessage(m);
17 } catch (IOException e) {
18 // TODO Auto-generated catch block
19 e.printStackTrace();
20 }

Aber es tut sich immer noch nichts.
Habt ihr eine Idee was ich ändern muss?

— geändert am 25.02.2014, 16:46:25

Antworten
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.401

25.02.2014, 16:47:53 via Website

Nimm den Debugger mit einem Brakepoint und schau dir einfach den Inhalt deines ByteArrays an. #
Dafür musst du nix in LogCat schreiben lassen

LG Pascal //It's not a bug, it's a feature. :) ;)

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

25.02.2014, 17:01:31 via Website

Hab jetzt erstmal den Sender mit dem Debugger gestartet aber der zeigt gar keine Variablen in der Variables View an.

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

25.02.2014, 17:20:01 via Website

Ja hat jetzt funktioniert also da scheint was drin zu sein.
Jetzt versuch ich es beim Empfänger, aber da kommt der gar nicht bis zu dem Breakpoint (ich habe den hinter das byte[] gesetzt)

Antworten
Gelöschter Account
  • Forum-Beiträge: 2.492

25.02.2014, 17:27:37 via Website

Bis zu dem s = ss.accept()
und dann zeigt er keine Variablen mehr an und ich kann auch nicht mehr auf "Weiter" drücken.
Fehler gibt es keine.

Antworten
Empfohlene Artikel