Bild empfangen über Socket

  • Antworten:70
  • OffenNicht stickyNicht beantwortet
  • 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.169

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
  • 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.169

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
  • 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.169

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
Pascal P.
  • Mod
  • Blogger
  • Forum-Beiträge: 10.169

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
  • 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.169

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

Empfohlene Artikel