inputstream hat plötzlich weniger inhalt

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
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

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
 
G

Guest

Gast
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

Gesperrter Benutzer
bereinige mal den code, was soll die 300er schleife...
Code:
     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!
 
G

Guest

Gast
soo erstmal danke für die antworten!

Code:
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
Code:
Funktion(neuesPosLen ,c,gui);

zeile 46
Code:
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
Code:
System.out.println(new String (b,0,b.length));
ausgebe, werden alle sätze eingelesen!

danke

jense
 

Bleiglanz

Gesperrter Benutzer
wenn
Code:
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
 
G

Guest

Gast
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

Gesperrter Benutzer
>>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.

The first byte read is stored into element b[0], the next one into b[1], and so on. The number of bytes read is, at most, equal to the length of b. Let k be the number of bytes actually read; these bytes will be stored in elements b[0] through b[k-1], leaving elements b[k] through b[b.length-1] unaffected.

If the first byte cannot be read for any reason other than end of file, then an IOException is thrown. In particular, an IOException is thrown if the input stream has been closed.


The read(b) method for class InputStream has the same effect as:
read(b, 0, b.length)
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?
 
G

Guest

Gast
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
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
L Socket Wie kann man in Java die Anzahl der Objekte in einem InputStream sehen ohne ihn durchgehen zu müssen Netzwerkprogrammierung 1
S Socket String InputStream in hex umwandeln Netzwerkprogrammierung 1
D GZIP InputStream lesen ohne zu encoden Netzwerkprogrammierung 1
F Java Server Scanner oder InputStream kann nicht gelsesen werden! Netzwerkprogrammierung 6
R Socket InputStream readObject > Connection Reset Netzwerkprogrammierung 3
windl InputStream cachen Netzwerkprogrammierung 3
K Socket InputStream wird nicht erzeugt Netzwerkprogrammierung 4
M Socket InputStream liest nicht vollständig Netzwerkprogrammierung 7
M Was macht Thread, wenn er aus einem "leeren" Inputstream liest ? Netzwerkprogrammierung 5
K Byte für Byte aus InputStream lesen Netzwerkprogrammierung 5
F JSch - inputstream is closed Netzwerkprogrammierung 13
M Socket InputStream sendet ausgaben von OutputStream zurück Netzwerkprogrammierung 2
D Inputstream to Outputstream Netzwerkprogrammierung 3
M InputStream and ObjectInputStream zur gleichen Zeit Netzwerkprogrammierung 11
T Inputstream -> verschiedene Objekte lesen Netzwerkprogrammierung 3
MQue Inputstream Timeout Netzwerkprogrammierung 2
S Servlet InputStream leer?! Netzwerkprogrammierung 14
G HTTP-Request InputStream-Problem Netzwerkprogrammierung 5
P Inputstream "verfügbar" Netzwerkprogrammierung 4
G JPG im InputStream Netzwerkprogrammierung 2
A InputStream liest immer komplettes PHP-Script Netzwerkprogrammierung 6
A InputStream ließt nur 65536 Zeichen anstatt ganzer Puffer Netzwerkprogrammierung 8
A inputstream teilen? Netzwerkprogrammierung 4
D InputStream (Socket) mit BufferedInputStream puffern Netzwerkprogrammierung 2
M Sockets und InputStream Netzwerkprogrammierung 8
R Client nimmt den Inputstream nicht an Netzwerkprogrammierung 5
S Mail anhang in InputStream packen Netzwerkprogrammierung 5
M InputStream - Bytes gehen verloren? Netzwerkprogrammierung 3
E Problem bei Sockets/InputStream über externe Klasse Netzwerkprogrammierung 5
André B. In einen InputStream schreiben? Netzwerkprogrammierung 6
Z ProgressBar auf BufferedOutput- & -InputStream Netzwerkprogrammierung 2
M JAX-WS unter Java 17 plötzlich nicht mehr möglich Netzwerkprogrammierung 5
staxx6 Mehr/ kleine oder Weniger/ große Pakete? Netzwerkprogrammierung 8

Ähnliche Java Themen


Oben