Bytestream solange auslesen bis keine Daten mehr vorhanden sind

  • Antworten:4
Bada Bung
  • Forum-Beiträge: 5

29.01.2014, 13:19:47 via Website

Hallo Leute und zwar folgendes Szenario:

Ich habe einen kleinen "Server" geschrieben, der regelmäßig diverse Strings in ein Bytearray (zwischen 1 und 1024 Byte) schreibt.
Dieses Bytearray wird in einen Stream geschrieben und dieser soll von meinem Client (Android) ausgelesen werden.
Beim testen hat das so halbwegs geklappt. Wenn ich aber um die 1024 Byte schreibe kam es häufiger vor, dass der String in mehrere Teile aufgeteilt wurde.
Als Grund habe ich eine Funktion ausgemacht, welche das auslesen des Streams "unterbricht". Jetzt bin ich gerade daran, den Stream solange auszulesen, bis alle Byte abgespeichert wurden. Damit die "ReadStream" Methode nicht unterbrochen werden kann. Aber irgendwie klappt das nicht.
Hat jemand hierzu ein Tutorial oder sehr gute Erklärung (auch für Dummies :( )?

Anbei meine aktuelle Funktion:
1public boolean readFromStream()
2{
3 byte[] receivedByteArray = new byte[1024];
4
5 sOut = null;
6
7 try
8 {
9 int numberOfBytesToRead = mmInStream.read(receivedByteArray);
10 Log.d(TAG, "Bytes im Stream: " + numberOfBytesToRead);
11
12 int countTheReadLoops = 0;
13
14 while (numberOfBytesToRead > 0)
15 {
16 Arrays.fill(receivedByteArray, (byte) 0); // clear array from previous read
17 int numberOfReadedBytes = mmInStream.read(receivedByteArray);
18 Log.d(TAG, "LOGGFILE 1");
19
20 if (numberOfReadedBytes > 0)
21 {
22 if ( null != sOut )
23 {
24 sOut.concat( new String(receivedByteArray) );
25 Log.d(TAG, "LOGGFILE 2.1");
26 }
27
28 else
29 {
30 sOut = new String(receivedByteArray);
31 Log.d(TAG, "LOGGFILE 2.2");
32 }
33
34 numberOfBytesToRead -= numberOfReadedBytes;
35 countTheReadLoops++;
36 Log.d(TAG, "LOGGFILE 3");
37 }
38 }
39
40 Log.d(TAG, "Lesen vom Stream ok - Durchläufe: " + countTheReadLoops);
41 return true;
42 }

— geändert am 29.01.2014, 13:22:58

Antworten
Fabian Simon
  • Forum-Beiträge: 359

29.01.2014, 14:26:21 via Website

Ohne Worte.
Meine StandartKlasse dafür.
1package programm.Connection;
2
3import java.io.DataInputStream;
4import java.io.DataOutputStream;
5import java.io.IOException;
6import java.io.InputStream;
7import java.io.OutputStream;
8
9import programm.main.StaticInc;
10/**
11 * Stream in und output handler fuer alle geoeffneten verbindungen
12 * @author Fasibio
13 *
14 */
15public class ConnectionStream extends Thread implements ICommunikator{
16
17 private InputStream input;
18 private OutputStream output;
19
20 private IMessage message;
21 private boolean close;
22
23 /**
24 * Standart Konstruktor
25 * @param input
26 * @param output
27 * @param message
28 */
29 public ConnectionStream(InputStream input, OutputStream output, IMessage message){
30 this.input = input;
31 this.output = output;
32 this.message = message;
33 }
34
35 @Override
36 public void run() {
37 super.run();
38 byte[] buffer = new byte[1024];
39 int bytes;
40 while (!close){
41 try{
42 bytes = input.read(buffer);
43 String readMessage = new String(buffer, 0, bytes);
44 message.newMessage(this, readMessage);
45 }catch (Exception e){
46 message.exceptionThrow(this, e);
47 break;
48 }
49 }
50 message.connectionClosed(this);
51 }
52
53
54 /**
55 * Liefert den InputStream zurueck
56 * @return
57 */
58 public InputStream getInputStream(){
59 return input;
60 }
61
62 /**
63 * Schließt die verbindung
64 */
65 public void close(){
66 this.close = true;
67 }
68
69 /**
70 * Schieckt einen String an den Client
71 * @param json
72 */
73 public void write(String json){
74
75 try {
76 StaticInc.printToConsole(" write to client : "+json);
77 output.write(json.getBytes());
78 output.flush();
79 } catch (IOException e) {
80 e.printStackTrace();
81 }
82 }
83
84 @Override
85 public String getCommunikatorName() {
86
87 return "Connection Stream";
88 }
89
90}

Antworten
Bada Bung
  • Forum-Beiträge: 5

29.01.2014, 15:52:18 via Website

So wie ich seh beendest du die connection nachdem in den Stream geschrieben wurde, oder?
Bei mir bleibt die Verbindung bestehen. Da über einen gewissen Zeitraum Daten vom Server an den Client geschickt werden.

Antworten
impjor
  • Forum-Beiträge: 1.793

29.01.2014, 21:09:22 via App

Hast du dir mal DataInputStream bzw. BufferedReader angesehen? Diese erleichtern solche Vorhaben um ein Vielfaches!

LG

Liebe Grüße impjor.

Für ein gutes Miteinander: Unsere Regeln
Apps für jeden Einsatzzweck
Stellt eure App vor!

Antworten
Fabian Simon
  • Forum-Beiträge: 359

30.01.2014, 08:14:27 via Website

Bada Bung
So wie ich seh beendest du die connection nachdem in den Stream geschrieben wurde, oder?
Nein !
1while (!close)
solange bleibt der Stream bestehen.

Antworten