# inputstream hat plötzlich weniger inhalt



## Guest (10. Feb 2005)

hallo!

ich habe folgendes problem!
ich habe eine client server anwendung, bei der ich daten vom server anforder und diese verarbeite.
über vpn funktioniert es einwandfrei.
im lan aber sende ich meine anfrage und bekomme entweder sofort oder nach 1-8 sätzen eine zu geringe menge daten zurück.
ich sollte immer 1926 bytes bekommen, doch dann bekomme ich (nach 1-8 sätzen) immer nur 14XX bytes zurück.

hier etwas code


```
//dataout = dataout ist mein dataoutputstream und in ist mein inputstream
// eine authentisierung auf dem server ist auch schon vollzogen

  public void Funktion(short poslen,byte[]Position,Anzeige gui)
  {
    try {
      this.gui = gui;
      byte c[] = Position;
      short positionlen = poslen;
      // (16 byte)
      String a = "XXXXXXXXXX"; 
      String b= "0";
      String d = "1";
      String flags = "0000"; 
      dataout.writeBytes(a);
      dataout.writeBytes(b);
      dataout.writeBytes(d);
      dataout.writeBytes(flags);
      //(24 byte)
      String server = "XXXXSERVER     ";
      String filler1 = " ";
      short s1= 342; 
      short s2= 4096; //Max Länge
      String filler2 = "    ";
      dataout.writeBytes(server);
      dataout.writeBytes(filler1);
      dataout.writeShort(s1);
      dataout.writeShort(s2);
      dataout.writeBytes(filler2);
      //(342 byte)
      short ReplyCode = 0;
      short s3 = 100;
      String AZ = " ";
      String AZe = " ";
      String filler =" ";
      String isA = "0";
      dataout.writeShort(ReplyCode);
      dataout.writeShort(s3);
      dataout.writeBytes(AZ);
      dataout.writeBytes(AZe);
      dataout.writeBytes(Username);// String 32 byte
      dataout.writeBytes(filler);
      dataout.writeBytes(isA);
      dataout.writeShort(positionlen);
      dataout.write(c);
      // jetzt daten
      dataout.flush();
      int len;
      boolean ok = false;
      byte[] b = new byte[1000000];
      while (!ok) {
        try {
          if ( (len = in.read(b)) == -1) {
            break;
          }
          byte b3 = b[80];
          byte b4 = b[81];
          short neuesPosLen = (short) ((b3<<8)|b4);

          for(int i = 0; i<300;i++)
          {
            c[i] = b[i+82]; //stand gerade auf 82
          }
           String flagabfrage = new String(b,12,4);
           byte b1 = b[40];
           byte b2 = b[41];
           short replaycode = (short) ((b1 << 8) | b2);
          if(flagabfrage.equals("0000") && replaycode == 0)
          {
            Controller.einlesen(b,len,gui);
            Funktion(neuesPosLen ,c,gui); 
            break; 
          }
          else{
           ok = true;
           break;
          }
        }
        catch (InterruptedIOException e) {
          //nochmal versuchen
        }
      }
      ok = false;
    }
    catch (IOException ex) {
     System.exit(0);
    }
  }
```

kann mir jemand sagen warum das so ist und wie ich das ändern kann?
(der server sendet auf jeden fall die daten)
danke !!!

jense


----------



## Bleiglanz (10. Feb 2005)

Probleme mit der MTU?

mal etherreal o.ä. anwerfen!


----------



## Guest (11. Feb 2005)

probleme mit der mtu?

kann ich nicht verstehen!
bei PPPoE werden von den 1518 byte(mtu) doch noch weitere 8 byte anderwertig gebraucht!
kann doch kein mtu-prob sein, oder?

wenn ich das byte array in der zeile 60 als string auf der konsole ausgebe, werden alle sätze eingelesen ohne prob..
(aber das dauert dann recht lange und ist ja auch keine lösung)

gruß
jens


----------



## Bleiglanz (11. Feb 2005)

bereinige mal den code, was soll die 300er schleife...

```
catch (InterruptedIOException e) {
          //nochmal versuchen 
          // FEHLER AUSGEBEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
          // WENIGSTENS e.printStackTrace()
        }
      }
      ok = false;
    }
    catch (IOException ex) {
     System.exit(0); // das ist bäh
          // FEHLER AUSGEBEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
          // WENIGSTENS e.printStackTrace()
```
ausserdem kann man ohne den unterschied VPN - im LAN nichts genaues sagen??

was macht der server?

mit ethereal zuschauen!


----------



## Guest (11. Feb 2005)

soo erstmal danke für die antworten!


```
catch (InterruptedIOException e) {
          //nochmal versuchen
          // FEHLER AUSGEBEN!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!1
          // WENIGSTENS e.printStackTrace()
        }
```

immer wenn der (Len = in.read(b)) == -1
wird e.printStackTrace() ausgeführt?
(das soll doch nicht sein, oder?)

die 300ter schleife füllt ein bytearray "c" und gibt so empfangene daten an den server zurück!

zeile 72

```
Funktion(neuesPosLen ,c,gui);
```

zeile 46

```
dataout.write(c);
```

zu System.exit(0);
wird ja nicht ausgeführt.

was seltsam ist .....
wenn ich den inhalt von b (daten) auf der konsole mit

```
System.out.println(new String (b,0,b.length));
```
ausgebe, werden alle sätze eingelesen!

danke 

jense


----------



## Bleiglanz (11. Feb 2005)

wenn 

```
System.out.println(new String (b,0,b.length));
```
alles liefert, dann sind ja alle daten angekommen und alles ist OK (b ist einfach ein byte[], das du in der Zeile in.read(b) gefüllt hast)

also passt alles im Netzwerk

=> das Problem muss woanders liegen


----------



## Guest (11. Feb 2005)

*nein nein!!!!*

nur wenn ich es mir ausgeben lasse entsteht der fehler nicht!

ohne die ausgabe bekomme ich schnell nur 14xx bytes
(durch die zeile wird wohl das prog gebremmst und der fehler tritt nicht auf)

jens


----------



## Bleiglanz (11. Feb 2005)

>>nur wenn ich es mir ausgeben lasse entsteht der fehler nicht! 

kann doch gar nicht sein, glaubst du etwa dass der inhalt eines byte[] davon abhängt, ob man es ausliest?

Die Frage ist erstmal, was in genau ist:

BufferedInputStream, ByteArrayInputStream, DataInputStream, 
FilterInputStream, read(), OutputStream, PushbackInputStream

Und dann solltest du dich mal mit der Methode read vertraut machen


> Reads some number of bytes from the input stream and stores them into the buffer array b. The number of bytes actually read is returned as an integer. This method blocks until input data is available, end of file is detected, or an exception is thrown.
> 
> If b is null, a NullPointerException is thrown. If the length of b is zero, then no bytes are read and 0 is returned; otherwise, there is an attempt to read at least one byte. If no byte is available because the stream is at end of file, the value -1 is returned; otherwise, at least one byte is read and stored into b.
> 
> ...


Der will bei dir in einem Aufruf eine Million bytes lesen, ist das Absicht?

Besonders nett: This method blocks until input data is available, end of file is detected, or an exception is thrown.

Es spielt also KEINE Rolle ob du nachher mit System.out irgendwas ausgibst, denn wenn die Methode read(b) zurückkehrt ist alles gelesen und im Array drinnen!

Kannst du mir mal erklären, was die while schleife eigentlich soll?


----------



## Guest (11. Feb 2005)

so hab das prob gelöst!

wie ich es in meinem code in zeile 2 geschrieben habe ist in der inputstream

das mit der 1000000 arraygröße war keine absicht!

die while schleife ist vorhanden damit ich erst weitermache wenn ich auch daten empfangen habe!

es kommt halt vor das daten durch in.read(b) eingelesen wurden aber noch 466 folgen.
die lösung war dann mit in.available() zu prüfen ob schon alles da ist.

thx
jense


----------

