Hallo liebe Java-Gemeinde,
mein Problem ist folgendes:
Ich habe mir eine eigene Klasse von InputStream abgeleitet welche ich später mit einem InputStreamReader und einen BufferedReader gewrapped habe.
Der InputStream dient als Puffer zur Entschlüsselung und Weiterleitung einer verschlüsselten Netzwerkverbindung und überschreibt read(), available(), skip() und markSupported().
Wenn nun die Methode readLine() von BufferedReader mehr Bytes vom stream lesen will, als vorerst da sind, dann blockt der InputStream seinerseits und wartet auf Netzwerkdaten.
Soweit so gut.
Nur komisch ist, dass wenn im Puffer (dh. bereits entschlüsselt) z.B. der String "ich bin ein String\nhallo\n" habe, readLine() einfach nicht mehr aufhört neue Bytes anzufordern, obwohl er schon 2 mal '\n' "überlesen" hat.
Ich habe in die read() Methode meines InputStreams mal eine Debug-Ausgabe geschrieben, welche bestatigt, dass read() solange aufgerufen wird, bis der Puffer "leer" ist und auf neue Netzwerkdaten gewartet werden muss.
Wahrscheinlich eine Kleinigkeit ...
Vielen Dank im vorraus :-D
Hinweis:
- "decrypted" ist der Puffer
- "lastindex" der index des zuletzt aus dem Puffer gelesenem Byte
- die Methode decrypt holt ein neues vershclüsseltes "Paket" vom Netzwerk (evt blockend)
Die Methode decrypt läuft einwandfrei.
mein Problem ist folgendes:
Ich habe mir eine eigene Klasse von InputStream abgeleitet welche ich später mit einem InputStreamReader und einen BufferedReader gewrapped habe.
Der InputStream dient als Puffer zur Entschlüsselung und Weiterleitung einer verschlüsselten Netzwerkverbindung und überschreibt read(), available(), skip() und markSupported().
Wenn nun die Methode readLine() von BufferedReader mehr Bytes vom stream lesen will, als vorerst da sind, dann blockt der InputStream seinerseits und wartet auf Netzwerkdaten.
Soweit so gut.
Nur komisch ist, dass wenn im Puffer (dh. bereits entschlüsselt) z.B. der String "ich bin ein String\nhallo\n" habe, readLine() einfach nicht mehr aufhört neue Bytes anzufordern, obwohl er schon 2 mal '\n' "überlesen" hat.
Ich habe in die read() Methode meines InputStreams mal eine Debug-Ausgabe geschrieben, welche bestatigt, dass read() solange aufgerufen wird, bis der Puffer "leer" ist und auf neue Netzwerkdaten gewartet werden muss.
Wahrscheinlich eine Kleinigkeit ...
Vielen Dank im vorraus :-D
Hinweis:
- "decrypted" ist der Puffer
- "lastindex" der index des zuletzt aus dem Puffer gelesenem Byte
- die Methode decrypt holt ein neues vershclüsseltes "Paket" vom Netzwerk (evt blockend)
Die Methode decrypt läuft einwandfrei.
Java:
private class AlgoInputStream extends InputStream {
byte[] decrypted = null;
int lastindex = -1;
Cipher cipher = null;
BufferedReader br = null;
public AlgoInputStream(BufferedReader br) {
this.br = br;
try {
cipher = Cipher.getInstance("AES");
cipher.init(Cipher.DECRYPT_MODE, AESKey);
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (NoSuchPaddingException e) {
e.printStackTrace();
} catch (InvalidKeyException e) {
e.printStackTrace();
}
}
@Override
public int read() throws IOException {
while (decrypted==null || !(lastindex+1<decrypted.length)) {
if (!decrypt()) {
return -1;
}
}
lastindex++;
System.out.println("read a byte from the buffer: (byte)"+decrypted[lastindex]+" (char)"+(char)decrypted[lastindex]);
return decrypted[lastindex];
}
@Override
public int available() throws IOException {
return decrypted.length-1-lastindex;
}
@Override
public boolean markSupported() {
return false;
}
@Override
public long skip(long n) throws IOException {
long skipnbr = (n<available())? n : available();
lastindex = (int) (lastindex+skipnbr);
return skipnbr;
}
private boolean decrypt() throws IOException {
lastindex=-1;
decrypted = null;
String input = null;
try {
System.out.println("trying to fetch & deBase64 a new line");
if ((input = br.readLine())!=null) {
decrypted = cipher.doFinal(Config.fromBase64_2(input));
return true;
}
} catch (IllegalBlockSizeException e) {
e.printStackTrace();
} catch (BadPaddingException e) {
e.printStackTrace();
}
return false;
}
}