Bilderupload unregelmäßiger Fehler

JavaJoe

Mitglied
Hallo alle miteinander!

Mit nachfolgendem code versuche ich auf meiner homepage gallerien zu veröffentlichen.
Server und client funktionieren sowei auch ganz und der code ist meiner meinung nach vollkommen richtig nur taucht ab und zu total unregelmäßig ein Fehler auf. Wenn ich z.B.: 300 bilder hochlade sind 2 davon defekt es fehlen ein paar bytes lade ich die selben bilder ein paar minuten später hoch sind alle ok oder andere defekt. Ich weiß einfach nicht woran das liegen kann oder wo ich suchen soll da der fehler so willkürlich auftritt als wenn ein defekt in den Streamklassen liegt.

ReadString()
und FormatString(String mess)
sind methoden die ich verwende um mehrzeilige Strings zu versenden.

Server:
Code:
    int anzahl = Integer.valueOf(ReadString());
    int count=0;
    InputStream in=null;
    FileOutputStream fo=null;
    System.out.println("anzahl: "+anzahl);
    BufferedInputStream input=null;



    while(count<anzahl)
    {
     
     Socket cur=null;
     String name="";


     try
     {

      System.out.println("Verbindung erwartet");
      cur = s.accept();
      reader2 = new BufferedReader(new InputStreamReader(cur.getInputStream()));
      name = ReadString2();
      System.out.println("Name: "+name);
      in = cur.getInputStream();
      input = new BufferedInputStream(cur.getInputStream());
      fo = new FileOutputStream(Name+gallerie+name);

     }catch(Exception x2)
     {
      System.out.println("Fehler beim namen!"+x2);
     }

      
     int read=0;
     byte[] buffer = new byte[1024];
     long bytes=0;
     
     try
     {

        while((read=input.read(buffer,0,1024))>0)
        {

            bytes = bytes+read;
            System.out.println("Schreibe in Datei. read: "+read);
            fo.write(buffer,0,read);
            fo.flush();
            


        }

        input.close();
        reader2.close();
        fo.close();
        in.close();
        cur.close();
        
        input=null;
        reader2=null;
        fo=null;
        in=null;
        cur=null;

     }catch(Exception x3)
     {
        System.out.println(x3);
     }

      System.out.println("Datei empfangen: "+bytes+" bytes!\n\r");
      count++;
      System.out.println("Count: "+ count);

    }

    System.out.println("Alle dateien empfangen!");

Client:
files ist ein araay von File objecten die übertragen werden sollen.
Code:
for(int i=0;i<files.length;i++)
      {

         File curr = files[i];
         Socket tmpsock=null;
          token = new StringTokenizer(curr.getName(),".");

        String ext ="";

             while(token.hasMoreTokens())
             {
               ext= token.nextToken();
             }

              
         

        if((curr.isFile()&&curr.canRead())&(ext.equalsIgnoreCase("jpeg")||ext.equalsIgnoreCase("jpg")||ext.equalsIgnoreCase("JPG")))
        {
            BufferedOutputStream  output=null;
            count++;
            lab.setText("Bild "+count+" von "+ficount);
            try
            {

              System.out.println("Baue Verbindung auf");
             tmpsock = new Socket("***",port);
             writer2 = new BufferedWriter(new    OutputStreamWriter(tmpsock.getOutputStream()));
             output = new BufferedOutputStream(tmpsock.getOutputStream()) ;

              System.out.println("Current file: "+curr.getName());


            }catch(Exception ex5)
            {

            }





           try
           {
             //System.out.println("Schreibe Namen: "+this.FormatString(curr.getName()+"\n"));

             writer2.write(this.FormatString(curr.getName()+"\n"));
             writer2.newLine();
             writer2.flush();


            BufferedImage image = ImageIO.read(files[i]);
            String Name  = curr.getName();

           // System.out.println("Hoehe: "+image.getWidth());
            // System.out.println("Breite: "+image.getHeight());
            double maxw=400;
            double maxh=400;
            double faktor=1.0;
          
            if(image.getWidth()>maxw&&image.getHeight()>maxh)
            {
             if(image.getWidth()>image.getHeight())
             {
              //System.out.println("Faktor = "+maxw+"/"+image.getWidth());
              faktor =( maxw/image.getWidth() );
             }else
             {
              faktor = maxh/image.getHeight();
             }

            }else
            {

             if(image.getWidth()>maxw)
             {
               faktor = maxw/image.getWidth();
             }
             if(image.getHeight()>maxh)
             {
              faktor = maxh/image.getHeight();
             }

            }

            //System.out.println("Fakto: "+faktor);
            double hoehe=100;
            double breite=100;


             hoehe = image.getHeight()*faktor;
             breite = image.getWidth()*faktor;


              System.out.println("Erstelle neues Bild. Hoehe: "+(int)hoehe+" Breite: "+(int)breite);
              Image out  =  image.getScaledInstance((int)breite,(int)hoehe,image.SCALE_SMOOTH );
              BufferedImage outImg = new BufferedImage((int)breite, (int)hoehe,
              BufferedImage.TYPE_INT_RGB);
              Graphics g = outImg.getGraphics();
              g.drawImage(out, 0, 0, null);
              g.dispose();




            
            File tmpfile = new File(Name);
         
            ImageIO.write(outImg,"jpeg",tmpfile);
            

            fin = new FileInputStream(tmpfile);
            byte[] buffer = new byte[1024];
           
            long bytes=0;

            while(fin.available()>0)
            {


             int read = fin.read(buffer);

             output.write(buffer,0,read);
             output.flush();
             tmpsock.getOutputStream().flush();

             System.out.println("Schreibe: "+read+" Bytes");
             bytes=bytes+read;



            }

            prog.setValue(count);



            System.out.println("Datei uebertragen: "+bytes+" Bytes!\n\r");

            output.close();
            tmpsock.getOutputStream().close();
            writer2.close();
            tmpsock.close();
            fin.close();
            output=null;
             writer2=null;
            tmpsock=null;
            fin=null;
           }catch(Exception x)
           {
             System.out.println(x);
           }

        }

      }





MFG
JavaJoe
 
Wirklich gute ideen hab ich nicht aber folgendes kannst du überprüfen:

Tritt der Fehler auch bei einer Übertragung an localhost auf?
Wenn nein, deutet das auf Übertragungsfehler hin die vom Protokoll nicht erkannt werden.

Benutzt du eine UDP oder eine TCP Verbindung?
Soviel wie ich weiß ist die TCP verbindung Resistenter gegen Übertragungsfehler, so dass ein Wechsel sinnvoll sein kann.

Alle Tipps ohne gewähr, weil ich nicht wirklich Ahnung von der Materie hab.
 
Hi,

habe mal drüber geschaut, es allerdings nicht ausprobiert.
Der Fehler scheint ja nur sporadisch aufzutreten und auf den ersten Blick sieht das ganze aus, als könnte das funktionieren.

Du könntest Deine Kommunikation so erweitern, dass der Server nach Erhalt der Datei die Anzahl der empfangenen Bytes zurück liefert.
Stimmt die Größe nicht, überträgt der Client die Datei noch einmal.

Warum das ab und an schief geht ist mir unklar, da das mit TCP nicht passieren sollte.

Gruß
joschi
 
Hey!
Danke erstmal für die antworten!
Benutze TCP Sockets und meiner meinung nach dürften da auch nicht einfach bytes verschwinden es ist aber ab und zu so...
Die dateien nach dem Upload zu prüfen hab ich mir auch schon überlegt entweder wie du vorgeschlagen hast die anzahl an bytes zu vergleichen oder ich hatte überlegt mit nem md5 hash.
Diese Idee geht mir aber iergendwo gegen den Strich weil das meiner Meinung nach so nicht richtig sein kann..

MFG
JavaJoe
 
Hi JavaJoe,

wenn Du möchtest, kannst Du auch gerne Deine Klassen als Anhang hochladen.
Dann schau ich's mir bei Gelegenheit mal genauer an.

Gruß
joschi
 
Alles klar ich häng mal den code an.
Nur die ausschlaggebenden Teile habe ich ja gepostet also da wo die datei versendet wird und wo der Fehler auftaucht.

Aber ich muss dich warnen, ich programmiere mit unter sehr wild vor mich hin:suspekt:
Nach dem Motto: Code like hell and see what happens;-)



MFG
 

Anhänge

Hi JavaJoe,

ist ja wirklich ein bissl wild ;) aber sollte im Prinzip so funktionieren.
Habs mal angetestet und hat auch soweit funktioniert. Ich kann Dir also auch nicht sagen, wo das Problem ist.

Zwei Dinge sind mir aufgefallen:

  • Du solltest den StackTrace zu den Exceptions ausgeben. Reine println's übersieht man zu einfach.
  • Deine indexOf gehen von Minimallängen aus,die eventuell nicht vorhanden sind. Dann geht Deine ganze Methode auf die Bretter.

Gruß
joschi
 
Hey!

Erstmal danke fürs drüberschauen!
Kann den Fehler auch echt nicht nachvollziehen. Ist ein wenig nervend wenn ein Fehler auftritt wo keiner sein sollte und wo man schon auf die Idee kommen könnte den Fehler bei der Java Umsetzung des TCP-Protokolles zu suchen:mad:

Was meinst du genau mit "indexOf"?
Werd die Dateien jetzt überprüfen lassen und wenn nötig erneut übertragen, auch wenn mir das so gar nicht gefällt!
Vielleicht hat ja sonst noch jemand eine Idee oder kennt das Problem...

MFG
 
Hi,

mit "indexOf" meine ich sowas:

Java:
line = line.substring(0,(line.length()-8));

Wenn line nicht mindestens acht Zeichen hat, geht das ganze auf die Bretter.
Wäre sauberer Du würdest das prüfen.

Nen offensichtlichen Fehler hab ich auch nicht gefunden.

Noch viel Erfolg...

Gruß
joschi
 
Zurück