Hallo zusammen!
Ich arbeite zZ. an einen kleinen Mud Client, um mir einige Programmierkonzepte näher zu bringen, die ich bisher umschifft habe
(MVC/Streams). In dieser Frage soll es jedoch nur um den FilterInputStream gehen, da ich die anderen Probleme bisher bereits lösen konnte.
Da die Kommunikation mit einem Mud im Regelfall über Telnet erfolgt habe ich eine Socketverbindung zu dem Server ("mg.mud.de") auf Port23 geöffnet und mir die Input/Output Streams geholt. Der InputStream wird dann über InputStreamReader und BufferedReader in einem eigenen Thread in einen String message ausgelesen und vom Datenmodell (s. mvc) überwacht.
Soweit so gut. Nun ist es allerdings so, das eine Telnet Verbindung nicht nur Daten, sondern auch Metainformationen und Anweisungen an den Client überträgt (Negotiatiate, etc.). Zu diesem Zweck verwendet Telnet als Zeichensatz idR. 7Bit ASCII, sodass mit einem Byte auch noch 128 mögliche Befehle übertragen werden können. Diese möchte ich nun mit einem FilterInputStream zwischen Socket und InputStreamReader rausfiltern, sodass sie mich in der späteren Darstellung der Daten nicht stören.
Hier meine bisherige Klasse
Leider funktioniert dies jedoch nicht, denn aus irgendeinem Grund lässt der Filter keinerlei Bytes mehr durch.
Ich hoffe ihr wisst weiter. Vielen Dank schonmal
Ich arbeite zZ. an einen kleinen Mud Client, um mir einige Programmierkonzepte näher zu bringen, die ich bisher umschifft habe
(MVC/Streams). In dieser Frage soll es jedoch nur um den FilterInputStream gehen, da ich die anderen Probleme bisher bereits lösen konnte.
Da die Kommunikation mit einem Mud im Regelfall über Telnet erfolgt habe ich eine Socketverbindung zu dem Server ("mg.mud.de") auf Port23 geöffnet und mir die Input/Output Streams geholt. Der InputStream wird dann über InputStreamReader und BufferedReader in einem eigenen Thread in einen String message ausgelesen und vom Datenmodell (s. mvc) überwacht.
Soweit so gut. Nun ist es allerdings so, das eine Telnet Verbindung nicht nur Daten, sondern auch Metainformationen und Anweisungen an den Client überträgt (Negotiatiate, etc.). Zu diesem Zweck verwendet Telnet als Zeichensatz idR. 7Bit ASCII, sodass mit einem Byte auch noch 128 mögliche Befehle übertragen werden können. Diese möchte ich nun mit einem FilterInputStream zwischen Socket und InputStreamReader rausfiltern, sodass sie mich in der späteren Darstellung der Daten nicht stören.
Hier meine bisherige Klasse
Code:
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package view;
import java.io.FilterInputStream;
import java.io.IOException;
import java.io.InputStream;
/**
*
* @author barthimaeus
*/
public class CommandFilter extends FilterInputStream {
public CommandFilter(InputStream in){
super(in);
}
@Override
public int read() throws IOException{
int temp = 0;
do {
temp = in.read();
if (temp ==-1){
return -1;
}
}while (temp>127);
return temp;
}
@Override
public int read(byte[] b) throws IOException{
int temp;
int i;
for (i = 0; i<b.length;){
if((temp = this.read())!=-1){
b[i]=(byte)temp;
i++;
}
else {
if (i==0){
return -1;
}
else {
break;
}
}
}
return i;
}
@Override
public int read(byte[] b, int off, int len) throws IOException{
int temp;
int i;
for (i = off; i<off+len;){
if((temp = this.read())!=-1){
b[i]=(byte)temp;
i++;
}
else {
if (i==off){
return -1;
}
else {
break;
}
}
}
return i-off+1;
}
}
Leider funktioniert dies jedoch nicht, denn aus irgendeinem Grund lässt der Filter keinerlei Bytes mehr durch.
Ich hoffe ihr wisst weiter. Vielen Dank schonmal
Zuletzt bearbeitet: