Anzeige:
Ergebnis 1 bis 9 von 9

Thema: java - kleiner proxy: fehler bei grafiken

  1. #1
    javafreak
    Gast

    java - kleiner proxy: fehler bei grafiken

    Code:
       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?

  2. #2
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    vielleicht ist es der explizite Cast nach Char

    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ä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  3. #3
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    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):
    Code:
    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ä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    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,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  5. #5
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    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ä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  6. #6
    javafreak
    Gast
    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

  7. #7
    javafreak
    Gast
    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:
    Code:
    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...

  8. #8
    Registrierter Benutzer Avatar von peschmae
    Registriert seit
    14.03.2002
    Ort
    Schweizland
    Beiträge
    4.549
    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 ):
    Code:
    OutputStream test = client_socket.getOutputStream();
    wird ersetzt durch

    Code:
    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ä
    The greatest trick the Devil ever pulled was convincing the world he didn't exist. -- The Usual Suspects (1995)
    Hey, I feel their pain. It's irritating as hell when people act like they have rights. The great old one (2006)

  9. #9
    javafreak
    Gast
    also, ich glaub', ich bin wirklich zu dusselig:

    Code:
     this.serververbindung=new Socket(host,80);    
           this.server_in= new BufferedInputStream(serververbindung.getInputStream());
           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

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •