# Client stürzt nach versand ab



## AntonWert (26. Feb 2006)

Habe eine Anwendung (Client Server) mit Fensteroberfläche geschrieben. 
Dabei werden Daten vom Client zum Server übertragen. Lokal funktioniert alles einwandfrei, nur wenn ich über Internet Daten von einem Kolegen übertragen möchte tritt ein schwerwiegendes Problem auf. (Als Anmerkung: alle notwendigen Ports und Firewalls sind natürlich richtig konfiguriert) 

Problem: 
Der Client verschickt alle Daten (Kontrolle mit Ausgabe von System.out.println()) 
Der Server bekommt die ersten Bytes von vielen. 
Die Java VM friert ein, auf dem Recher (XP) arbeitet kein TCP/IP Stack (kein Ping - nix) und nur ein Neustart hilft. 

Verwendet wird jeweils das aktuelle JDK und JRE. Bin sowas von Ratlos  und daher über jede Hilfe dankbar! 


```
public class web_sync 
{ 

  public static void main(String[] args) 
   { 
             try 
            { 
      

           buttonSend.addActionListener(new ActionListener() 
                { 
                    public void actionPerformed(ActionEvent evt) 
                        { 
                                
                        int pos = liste.getSelectedIndex(); 
                        if (pos>=0) 
                            { 
                    try 
                                { 
                        Socket clientSocket = new Socket(ip_Feld.getText(),8833); 
                               File datei = new File(""+basepath_Feld.getText()+liste.getItem(pos)); 
                                                          
                               String Dateiname = ""+datei; 
                               String DateinameKurz = ""+liste.getItem(pos); 
                               
                                System.out.println("Sender: Datei: "+Dateiname); 
                                System.out.println("Sender: Basepath: "+basepath_Feld.getText()); 
                                
                        RandomAccessFile input = new RandomAccessFile(datei,"rw"); 
                        
                                int bytes = (int)input.length(); 
                                byte buffer[] = new byte [bytes+1]; 
                                                                    
                                input.read(buffer,0,bytes); 
                                                                    
                                char c; 
                    
                        System.out.println("Zu sendende Dateigroesse: "+bytes); 
                                 
                                // größe 
                                c = (char)(bytes % 200); 
                                clientSocket.getOutputStream().write(c); 
                         c = (char)((bytes/200) % 200); 
                                clientSocket.getOutputStream().write(c); 
                                c = (char)((bytes/(200*200)) % 200); 
                                clientSocket.getOutputStream().write(c); 
                                
                                //länge dateiname 
                                int laengeDateiname  =DateinameKurz.length(); 
                                c = (char)(laengeDateiname); 
                                clientSocket.getOutputStream().write(c); 
                        
                                 
                                // zeichen dateiname 
                                for (int i = 0; i<laengeDateiname; i++) 
                               { 
                            c = DateinameKurz.charAt(i); 
                                   System.out.println("Sender: Sende Namen: "+c); 
                                   clientSocket.getOutputStream().write(c); 
                            } 
                           
                               
                               //daten 
                               for (int i = 0; i<bytes; i++) 
                               { 
                                   clientSocket.getOutputStream().write(buffer[i]); 
                            System.out.println("Code 16"); 
                              } 
                                
                                clientSocket.close();    
                         System.out.println("Code 17"); 
                               
                                } 
                          catch (IOException e) 
                        { 
                        System.err.println(e);    
                        InfoDialog infoDialog = new InfoDialog(frame,    "Fehler beim senden", "Meldung"); 
                        infoDialog.setVisible(true); 
                        } 
                            } 
                       frame.pack(); 
                System.out.println("Code 19"); 
                        } 
                } 
                ); 
  
    try 
        { 
        System.out.println("Warte auf Verbindungen auf Port 8833..."); 
        ServerSocket echod = new ServerSocket(8833); 
        while (true) 
            { 
             Socket socket = echod.accept(); 
             (new Server_Thread(++cnt, socket, basepath_Feld.getText(),frame)).start(); 
               } 
         } 
         catch (IOException e) 
         { 
               System.err.println(e.toString()); 
               System.exit(1); 
         } 

   } 
 }
```





```
class Server_Thread extends Thread 
 { 

   public void run() 
   { 
     String msg = "EchoServer: Verbindung " + name; 
     System.out.println(msg + " hergestellt"); 
     try { 
       InputStream in = socket.getInputStream(); 
       OutputStream out = socket.getOutputStream(); 
       int c; 
       int bytes; 
       String dateiErweiterung = new String(); 
        
          boolean verbindungOK = true; 
        int data1[] = new int [300]; 
      
       for (int i = 0; i<3; i++) 
           { 
        c = in.read(); 
           if (c==-1) 
               { 
               System.out.println("Server Code 3a "); 
               verbindungOK = false; 
               break; 
               } 
           data1[i] = c;    
           } 
        
       bytes = data1[0] + data1[1]*200 + data1[2]*200*200; 

      int laengeDateiname = 0; 
       if (verbindungOK == true)          
           { 
          c = in.read(); 
           if (c==-1) 
               verbindungOK = false; 
       laengeDateiname = c; 
           } 
  

      char data[] = new char [laengeDateiname+1]; 
      for (int i = 0; i<laengeDateiname+1; i++) 
        data[i] = 0; 

       //dateiname 
       if (verbindungOK == true)          
           { 
          for (int i = 0; i<laengeDateiname; i++) 
           { 
           c = in.read(); 
           if (c==-1) 
               { 
               verbindungOK = false; 
               break; 
               } 
           data[i] = (char)c;    
    } 
    dateiErweiterung = new String(data,0,laengeDateiname); 
        } 
        
        char datei[] = new char [bytes+100]; 
        
       //daten 
       if (verbindungOK == true)          
           { 
          for (int i = 0; i<bytes; i++) 
           { 
           c = in.read(); 
           if (c==-1) 
               { 
               verbindungOK = false; 
               break; 
               } 
           datei[i] = (char)c;    
           } 
        } 
        

      if (verbindungOK == true)          
           { 
    File dateiName = new File(baseDir+dateiErweiterung); 
    System.out.println("Datei: "+dateiName); 

      RandomAccessFile output = null; 
    try 
        { 
        dateiName.delete(); 
        output = new RandomAccessFile(dateiName,"rw");    
              for (int i = 0; i<bytes; i++) 
                   { 
                   output.write(datei[i]);    
                   } 
        } 
        catch (IOException e) 
        { 
        System.err.println(e);    
        } 
        finally 
        { 
        try 
            { 
            if (output!=null) 
                output.close();                
            } 
            catch (IOException e) 
            { 
            System.err.println(e);    
            } 
        } 
           } 
        
        //out.write((char)c);        
        

       System.out.println("Verbindung " + name + " wird beendet"); 
       socket.close(); 
     } catch (IOException e) { 
       System.err.println(e.toString()); 
     } 
   } 
 }
```


----------



## ypser (26. Feb 2006)

Hy
Warum so umständlich?
Du solltest die Daten  Paketweise einlesen und in einer schleife senden bzw empfangen

Bsp. Sender

         FileInputStream fis = new FileInputStream(directory);
        //write byte by byte 2048 bytes
                    while((totalSizeRead = fis.read(packet,0,packet.length)) >=0){
        out.write(packet,0,totalSizeRead);
                    }


------------------------------------------------------------------------
Bsp. Empfänger

  int data;
  int totalDataRead;
  int totalSizeWritten;
  int totalSizeRead;
  int PACKET_SIZE=2048;                //Packetgrösse 2048
  byte[] packet=new byte[PACKET_SIZE];
  .........
  .........

  FileOutputStream fos = new FileOutputStream(directory);
while((totalDataRead = infrom.read(packet,0,packet.length))>-1) {
 fos.write(packet,0,totalDataRead);

}


----------



## AntonWert (27. Feb 2006)

Ok, vielleicht etwas umständlich, aber muss doch auch so gehen ohne das irgendwas dabei abschmiert.


----------



## ypser (27. Feb 2006)

Ich programmiere gerade ein Filesharing Proggi für mp3 und hatte das gleiche Problem. Mit Paketweise senden war das Problem jedenfalls behoben. Dein Empfänger kommt  mit der ankommenden Datenmenge nicht klar und schmiert ab.


----------



## Bleiglanz (27. Feb 2006)

bitte keine lang laufenden Operationen in einem EventListener, die GUI bleibt so lange eingefroren bis die ActionPerformed fertig ist (insbesondere wenn du ein accept für einen ServerSocket aufrufst)

ruf getOutputStream bitte nur einmal auf, du machst das immer wieder das ist witzlos

clientSocket.getOutputStream().write(buffer_); ist auch komisch, es gibt eigene Methoden dafür gleich ein ganzes byte[] zu senden

verwende Buffered Streams, das ist besser beim Arbeiten mit Netzwerken_


----------



## AntonWert (27. Feb 2006)

Habe nun das ganze umprogrammiert, mal sehen was ein Test (heute Abend) bringt.

@ypser:
Das komische ist ja dass der Sender, bei mir der Client abschmiert. Aber wie ja schon beschrieben schmiert ja auch nicht nur Java ab - sonderen (vermutlich) der ganze WinXP TCP/IP Stack. Das dürfte doch nicht sein - kennst du genau dieses Problem?


----------



## ypser (28. Feb 2006)

Stack-Überlauf.

War dein Test erfolgreich ? 

Wenn nicht  - guggsdu hier

http://www.codecomments.com/archive257-2004-3-152201.html


----------



## stev.glasow (28. Feb 2006)

crossposting http://www.c-plusplus.de/forum/viewtopic-var-t-is-138464.html


----------



## stacküberlauf? (28. Feb 2006)

ypser hat gesagt.:
			
		

> Stack-Überlauf.
> 
> War dein Test erfolgreich ?
> 
> ...



Das muss aber an Java liegen. Mit C kriegt man sowas nicht hin.


----------



## youssef (1. Mrz 2006)

@Bleiglanz

wie kann man am besten lange und aufwendige aktionen und Berechnungen in einem eventlistener implementieren.
ich muss in meinem Applet nach einen maus click viele Berechnungen machen um die position der Click in meine verschiedene komponenete (Tasten und Rechtecke) zu lokalisieren und dann bestimmte Aktionen durchführen.
die aktionen können ein bild umschaltung sein oder öffnen eines kleinen Fensters mit Inputfeld zur eingabe. manchmal reagiert das Applet überhapt nicht auf den Mouseevent und manchmal sehr langsam

wird mein Programm auf mausevents besser und schnell reagieren wenn ich die Aktionen in einem Thread ausführen lasse ?

danke im voraus für jede Anregung

hier der Code



```
class MyMouseListener extends MouseAdapter  implements Runnable
    {
     private Bfrect     bfr   = null;
     Thread bild_umschalten = null;
     String str;
     public void mousePressed( MouseEvent mouseEvent ) 
       {
        mouse_event = true;
        int ii,x1,x2,y1,y2,x,y,typ=0,ref=0;
        boolean flag=false, b_flag = false;
        x = mouseEvent.getX(); y =  768-mouseEvent.getY();
        ii = 1;
        bfr = bfrectbild_1.getBfrect(ii);
        while(ii<=bfrectbild_1.getMax_bfr() && flag ==false)
          {
           x1 = bfr.getX1();
           x2 = bfr.getX2();
           y1 = bfr.getY1();
           y2 = bfr.getY2();
           if(x > x1 && x < x2 && y > y1 && y < y2)
             {
              typ = bfr.getBftyp();
              flag=true;
              switch(typ)
                {
                 case 1: case 4: //SOLLWERT - MESS
                         ref = bfr.getBfref();
                         typ = 1;
                 break;
                 case 2: case 5://SOLLWERT - BIN
                         ref = bfr.getBfref();
                         typ = 2;
                 break;
                 case 3: case 6: //BILD
                      if(bfr.getBfstr() != null)
                        {
                 str = "bild_" + bfr.getBfstr() + ".html";
                         b_flag = true;
                 stop = true;
                 bild_umschalten = new Thread(this);
                 bild_umschalten.start();
                        }
                 break;
                }
             }
              if((!flag) && (!b_flag))
           bfr = bfrectbild_1.getBfrect(++ii);
          }
        if(!flag)
          {
           ii = 1;
           bft = bftbild_1.getBftast(ii);
           while(ii<=bftbild_1.getMax_bftast() && flag ==false)
             {
              x1 = bft.getX0();
              x2 = bft.getX1();
              y1 = bft.getY0();
              y2 = bft.getY1();
              if(x > x1 && x < x2 && y > y1 && y < y2)
                {
                 typ = bft.getBfunc();
                 flag=true;
                 switch(typ)
                   {
                    case 1: case 2: case 3:
                         ref = bft.getBfref();
                         flag=true;
                    break;
                   }
                }
              if(!flag)
                bft = bftbild_1.getBftast(++ii);
             }
          }
        if(!flag)
          {
           ii = 1;
           mbr = mbrectbild_1.getBrect(ii);
           while(ii<=mbrectbild_1.getMax_br() && flag ==false)
             {
              x1 = mbr.getX0();
              x2 = mbr.getX1();
              y1 = mbr.getY0();
              y2 = mbr.getY1();
              if(x > x1 && x < x2 && y > y1 && y < y2)
                {
                 ref = mbr.getBref();
                 typ = 1;
                 flag=true;
                }
              if(!flag)
                mbr = mbrectbild_1.getBrect(++ii);
             }
          }
        if(!flag)
          {
           ii = 1;
           bbr = bbrectbild_1.getBrect(ii);
           while(ii<=bbrectbild_1.getMax_br() && flag ==false)
             {
              x1 = bbr.getX0();
              x2 = bbr.getX1();
              y1 = bbr.getY0();
              y2 = bbr.getY1();
              if(x > x1 && x < x2 && y > y1 && y < y2)
                {
                 ref = bbr.getBref();
                 typ = 2;
                 flag=true;
                }
              if(!flag)
                bbr = bbrectbild_1.getBrect(++ii);
             }
          }
        if((flag) && (!b_flag))
          {
           if(setSW != null)
             {
              if(!setSW.getTflag())
                {
                 setSW = null;
                 setSW = new setSollwert(typ,ref);
                }
             }
           else
             {
              setSW = new setSollwert(typ,ref);
             }
          }
        }

            /*** Bild_Umschalten Thread ***/
            public void run()
            {
                 Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
                 start(str);
        }

     } // ende Class MyMouseListener
```


----------



## Gast12 (1. Mrz 2006)

lol, der Code ist aber grottig.


----------



## youssef (1. Mrz 2006)

was meinst du mit "grottig" ?
ich habe meinen Kollegen gefragt und der hat gemeint dass das "sehr schlecht" bedeutet.
falls das stimmt kann ich mit so eine Aussage nicht anfangen. dein Beitrag wäre vielleicht sinvoller und konstruktiver wenn du angibt was genau  im Code schlecht ist damit ich ihn auch verbessern und optimieren kann

danke


----------



## Gast12 (2. Mrz 2006)

Die Funktion ist *viel * zu lang, die Bezeichner sind unverständlich und du benutzt irgendwelche Magic Numbers bei switch.


----------



## AntonWert (5. Mrz 2006)

Mein Test war erfolgreich, auch wenn es etwas länger gedauert hat.
Dank an alle die sich bemüht haben!


----------

