Archiv verlassen und diese Seite im Standarddesign anzeigen : java - kleiner proxy: fehler bei grafiken
javafreak
01-07-2003, 20:54
this.serververbindung=new Socket(host,80);
this.server_in=serververbindung.getInputStream();
this.server_out = new PrintStream(serververbindung.getOutputStream());
this.client_in=client_socket.getInputStream();
this.client_out = new PrintStream(client_socket.getOutputStream());
//kommando an den server weiterleiten
System.out.println(client_socket.getInetAddress(). getHostAddress()+": "+command+" "+url);
server_out.print(command +" "+url+" "+http_version);
server_out.println();
server_out.print("HOST: "+host);
server_out.println();
server_out.println();
int len;
while ((len=server_in.read())!=-1) {
client_out.print((char)len);
}
client_socket.close();
serververbindung.close();
}
ich benutz' diese methode, um die vom http-server ankommenden daten an den client weiter zuleiten. problem an der sache: text kommt einwandfrei durch, grafiken (z.b. jpg) aber nicht: entweder kommt vom browser 'ne fehlermeldung, dass die datei beschädigt sei oder es werden nur bunte klötzchen angezeigt.
hat jemand 'ne idee, was da schief läuft, und wie man das korrigieren könnte?
peschmae
02-07-2003, 07:43
vielleicht ist es der explizite Cast nach Char :confused:
ist der denn nötig? Das was du liest is ja n int (auch wenn nur n byte inhalt) - solltest du dann nicht auch das byte aus dem int rausbröseln dem java zeugs überlassen?
MFG Peschmä
peschmae
02-07-2003, 11:19
vielleicht ist das Problem, dass byte der meisten Plattformen jeweils von 0 bis 255 reicht - ein java byte aber von -127 bis 128, was ja bei einer Konvertierung einen Informationsverlust zur Folge hätte
deshalb besser (in der Hoffnung, Java kümmere sich dan schon darum):
client_out.print(len);
ausserdem beruhigt (;) ) noch das:
Print a character. The character is translated into one or more bytes according to the platform's default character encoding, and these bytes are written in exactly the manner of the write(int) method.
MfG Peschmä
anda_skoa
02-07-2003, 17:53
Ich denke, blockweises Lesen und Schreiben ist einfacher und effizienter.
Dann braucht man ausgabesetig auch keinen PrintStream.
einfach ein byte[] Array als Puffer anlegen und dann InputStream.available() Bytes aufeinmale mit read(byte[], int, int) lesen.
Wenn available > Puffer Größe, nur Puffergröße Bytes lesen (no na :) )
Dann alles gelesene mit write(byte[], int, int) schreiben.
Ciao,
_
peschmae
02-07-2003, 18:29
oups, da hast du recht :)
allerdings löst das noch nicht das Rätsel der Datenkorruption oder wie das auch heisst ;)
ausser es sollte wider erwarten doch gehen...
MfG Peschmä
javafreak
03-07-2003, 09:39
erstmal thx für die antworten,
client_out.print(len);
der funktioniert schon mal nicht: da kommen nur zahlen beim browser an....
(wäre ja auch zu einfch gewesen *g*)
die idee mit dem byte[] probier' ich gleich mal aus
javafreak
03-07-2003, 10:38
einfach ein byte[] Array als Puffer anlegen und dann InputStream.available() Bytes aufeinmale mit read(byte[], int, int) lesen.
Wenn available > Puffer Größe, nur Puffergröße Bytes lesen (no na )
Dann alles gelesene mit write(byte[], int, int) schreiben.
wie genau meintest du das? irgendwie bin ich zu dusselig, den punkt in der javadoc bei sun zu finden...
hab's jetzt so gelöst:
this.serververbindung=new Socket(host,80);
this.server_in=serververbindung.getInputStream();
this.server_out = new PrintStream(serververbindung.getOutputStream());
this.client_in=client_socket.getInputStream();
this.client_out = new PrintStream(client_socket.getOutputStream());
OutputStream test = client_socket.getOutputStream();
//kommando an den server weiterleiten
System.out.println(client_socket.getInetAddress(). getHostAddress()+": "+command+" "+url);
server_out.print(command +" "+url+" "+http_version);
server_out.println();
server_out.print("HOST: "+host);
server_out.println();
server_out.println();
int len;
byte[] b = new byte[1];
while ((len=server_in.read(b))!=-1) {
test.write(b,0,len);
//client_out.print((char)len);
}
client_socket.close();
serververbindung.close();
}
funkt eigentlich wunderbar, es ist nur absolut langsam, setzt man die grösse des byte[] hoch, wird's schneller, aber wie soll ich da denn jetzt InputStream.aviable() einbauen? in der doku steht, dass er immer 0 zurrückgiebt...
peschmae
03-07-2003, 11:03
die Apidoc ist das dusselige Teil daran:
Returns the number of bytes that can be read (or skipped over) from this input stream without blocking by the next caller of a method for this input stream. The next caller might be the same thread or or another thread.
The available method for class InputStream always returns 0.
This method should be overridden by subclasses.
anda_skoa hat da wohl ein bisserl schnell gelesen oder gleich noch weitergedacht :)
eine verschnellerung der Java-IO-Operationen gibts immer dann, wenn du einen BufferedReader/Writer bzw BufferedInput/OutputStream verwendest (als wrapper) - zugleich funktioniert hier auch das available() so wie gewünscht
so etwa (dann musst du dich noch um das Available-Handling kümmern, das mach ich jetzt nicht :cool:):
OutputStream test = client_socket.getOutputStream();
wird ersetzt durch
BufferedOutputStream test = new BufferedOutputStream(client_socked.getOutputStream ());
selbiges für this.server_out und this.server_in und etc...
(deren Deklaration du nicht gepostet hast)
MfG Peschmä
javafreak
04-07-2003, 16:37
also, ich glaub', ich bin wirklich zu dusselig:
this.serververbindung=new Socket(host,80);
this.server_in= new BufferedInputStream(serververbindung.getInputStrea m());
this.server_out = new PrintStream(serververbindung.getOutputStream());
this.client_in=client_socket.getInputStream();
this.client_out = new PrintStream(client_socket.getOutputStream());
BufferedOutputStream test = new BufferedOutputStream(client_socket.getOutputStream ());
//request an den server weiterleiten und angeforderte url auf konsole mit ausgeben
System.out.println(client_socket.getInetAddress(). getHostAddress()+": "+command+" "+url);
Iterator it = request.iterator();
while (it.hasNext()){
server_out.println(it.next());
}
server_out.println();//doppeltes cr/lf => client fertig mit request senden
server_out.println();
int len;
while (server_in.available()>0) {
if (server_in.available()>100) {
byte[] b = new byte[100];
len=server_in.read(b);
test.write(b,0,len);
}
else {
int available= server_in.available();
byte[] b = new byte[available];
len=server_in.read(b);
test.write(b,0,available);
}
}
client_socket.close();
serververbindung.close();
}
so hab ich das jetzt umgebaut, problem an der sache: server_in.aviable() giebt immer 0 zurrück...
ansonsten liegen die klassen hier (http://borchers.homelinux.net/uni/proxy.zip)
Powered by vBulletin® Version 4.2.5 Copyright ©2025 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.