Client stürzt nach versand ab

Status
Nicht offen für weitere Antworten.
A

AntonWert

Gast
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!

Code:
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); 
         } 

   } 
 }




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

Mitglied
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);

}
 
A

AntonWert

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

ypser

Mitglied
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

Gesperrter Benutzer
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
 
A

AntonWert

Gast
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?
 
Y

youssef

Gast
@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


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
 
Y

youssef

Gast
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
 
G

Gast12

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

AntonWert

Gast
Mein Test war erfolgreich, auch wenn es etwas länger gedauert hat.
Dank an alle die sich bemüht haben!
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D Client-Rechner stürzt ab - was dann? Netzwerkprogrammierung 2
I Performanteste Kommunikationsmethode zwischen Client u. Server Netzwerkprogrammierung 4
L Socket Automatische Zuweisung von Server und Client Rolle Netzwerkprogrammierung 12
ExceptionOfExpectation Server/Client-Kommunikation Netzwerkprogrammierung 34
M Server-Client-System für Browsergame Netzwerkprogrammierung 5
B Axis2 Webservice mit Client Zertifikat Authentifizierung Netzwerkprogrammierung 3
Yonnig Threads mit Client/Server und GUI (laufend bis button-click) Netzwerkprogrammierung 9
T Jetty mit Client-Zertifikat nur bei spezifischer URL Netzwerkprogrammierung 1
J Einlesen von Servernachrichten von TCP-Client Netzwerkprogrammierung 17
J Client-Server und SOAP Netzwerkprogrammierung 23
L30nS RMI Aufruf einer Client-Methode von einem RMI-Server Netzwerkprogrammierung 3
T String von Client zu Server kommt nicht an Netzwerkprogrammierung 92
D WebSocket Server mit HTML Client und Java Server Netzwerkprogrammierung 5
D Server - Client Informationsaustausch, Möglichkeiten Netzwerkprogrammierung 3
H Socket Chat entwickeln mit Java Server Client Netzwerkprogrammierung 4
X Kann ich einen Client/Server verbindung hinkriegen die mir alle paar Sekunden die aktuellen Daten per Realtime zuschickt ? Netzwerkprogrammierung 9
T Client zu Client Kommunikation Netzwerkprogrammierung 2
D Slf4j - Logging - Client-Server Architektur Netzwerkprogrammierung 3
J client server mit nur einem PC Netzwerkprogrammierung 33
M Socket Nachricht von TCP-Client an Server schicken Netzwerkprogrammierung 12
M Socket Verbindung Matlab(Server) Java(Client) Netzwerkprogrammierung 1
R Socket FATAL EXCEPTION MAIN bei Socket based client/server app Netzwerkprogrammierung 2
G Server-Client IO Problem Netzwerkprogrammierung 6
ruutaiokwu ständig "sender address rejected: improper use of smtp" bei smtp-client Netzwerkprogrammierung 4
J HTTP [Java 9] Neuer HTTP Client - Tutorial Netzwerkprogrammierung 3
A Chatserver/-client - Code stoppt bei readUTF() Netzwerkprogrammierung 7
I Socket Das erste Server-Client Programm Netzwerkprogrammierung 16
L Zugriffprobleme Client - Webservice AspenTechnology Netzwerkprogrammierung 0
A Client Client Übertragung Netzwerkprogrammierung 12
M Socket Server antwortet dem Client nicht Netzwerkprogrammierung 6
K Socket Netty Client wirft Fehler! Netzwerkprogrammierung 3
I Client/Server Kommunikation bei einem Spiel Netzwerkprogrammierung 4
E Objekte versenden, Client-Server Netzwerkprogrammierung 25
C Mini Client-Server-Anwendung funktioniert nicht Netzwerkprogrammierung 8
U Client Soap Verbindung wieder schließen Netzwerkprogrammierung 0
U Socket Client mit hash authentifizieren Netzwerkprogrammierung 3
F HTTP HTTP Rest Client mit TLS1.2 und selbst signiertem Zertifikat Netzwerkprogrammierung 2
P Server als Client nutzen Netzwerkprogrammierung 8
D Socket Run Args Client/Server Socket Netzwerkprogrammierung 1
Cromewell Socket Multithreaded Server und Client Netzwerkprogrammierung 1
Y Client/Server/DB communication Netzwerkprogrammierung 3
JavaWolf165 Socket mit .writeUtf etwas vom Client zum Server schicken Netzwerkprogrammierung 13
J Client - Serversocket Netzwerkprogrammierung 1
P RMI Client Server Programm über Internet Netzwerkprogrammierung 2
brainless Client Server Kommunikation verschlüsseln Netzwerkprogrammierung 13
gamebreiti Socket Server / Client Anwendung Manipulation von Objekten durch Server Netzwerkprogrammierung 9
T Socket Server/Client Kommunikation Netzwerkprogrammierung 8
N Fragen zu Sockets Client Netzwerkprogrammierung 3
F Extasys TCp Client extends Funktion Netzwerkprogrammierung 0
F Server Client Anwendung mit UDP Netzwerkprogrammierung 2
O Client zwischen XML und JSON auswählen lassen Netzwerkprogrammierung 2
A RMI Wo treten Exceptions bei RMI Aufrufen auf? Auf Client oder auf Server? Netzwerkprogrammierung 3
A ByteBuffer - Client/Server Netzwerkprogrammierung 9
A Socket Wie ein einfacher Multithreads Service mit Telnet als Client mit Observable/Observer gelöst.... Netzwerkprogrammierung 0
K C# Server - Android Client Netzwerkprogrammierung 0
T Application Client NullPointerExc Netzwerkprogrammierung 7
V TCP Client funktioniert auf Emulator aber nicht auf Smartphone Netzwerkprogrammierung 5
H Machbarkeitsfrage: TCP/IP Client (z.B. Netty) für Java Web Applcation Netzwerkprogrammierung 1
P MIME-TYPE Erklaerung, Kommunikation zwischen Client und Server Netzwerkprogrammierung 3
H HTTP REST Jersey - PUT-Beispiel von Client senden Netzwerkprogrammierung 0
J Sichere Kommunikation bei Server Client Netzwerkprogrammierung 3
T Frage zu Client-Server Applikation Netzwerkprogrammierung 2
H Socket Client/Server Socket Programmieren Netzwerkprogrammierung 1
M Theoretische Frage zu Server - Client Netzwerkprogrammierung 2
P HTTP Server / Client Netzwerkprogrammierung 1
N FTP FTP Client invalid IPv6 address (Apache Commons Net API) Netzwerkprogrammierung 6
F TCP Client, verbindung aufrecht halten Netzwerkprogrammierung 0
X RMI: Woher kennt der Client das Schnittstellen-Interface? Netzwerkprogrammierung 2
E Thematik Client server Netzwerkprogrammierung 2
D UDP Client empfängt nichts Netzwerkprogrammierung 2
D Client/Server per Crossover Lan Kabel Netzwerkprogrammierung 1
S Client Server Connection Netzwerkprogrammierung 4
V erste Client - Server Anwendung, paar Fragen wie Socketverbindung checken usw. Netzwerkprogrammierung 4
S Client Anwendung mit zentraler SQL-Datenbank Netzwerkprogrammierung 3
N Client Identifikation eines Servers Netzwerkprogrammierung 1
S Sichere Server/Client Architektur Netzwerkprogrammierung 1
D Chat Server/mehre Client Netzwerkprogrammierung 9
I Server+Client Netzwerkprogrammierung 3
N Client am Server abmelden Netzwerkprogrammierung 0
F Server/Client Probleme Netzwerkprogrammierung 3
D SSH Client Netzwerkprogrammierung 7
U Socket Instant Messanger (Server Linux, Client Windows) Netzwerkprogrammierung 1
B TCP Client Android Netzwerkprogrammierung 3
Athena Grundsatzfragen zu Client-Server-Architektur / Matchmaking Netzwerkprogrammierung 1
A Problem beim Senden von Client zu Server Netzwerkprogrammierung 10
F Client Server DB Netzwerkprogrammierung 0
A Verständnisfrage Multi-Threaded Client/Server Netzwerkprogrammierung 5
F Tipps zum Thema Server/Client vie SOAP Netzwerkprogrammierung 0
OnDemand Ist Client noch angemeldet? Netzwerkprogrammierung 7
F Socket Java - Server/Client simple Netzwerkprogrammierung 1
D Socket UDP Client reagiert nicht auf spontane Meldungen Netzwerkprogrammierung 5
R Zeitliche Syncronisation Server - Client Netzwerkprogrammierung 0
S Server-Client: Image senden Netzwerkprogrammierung 2
C Multithreading Client / Server erklärt Netzwerkprogrammierung 11
M Client sendet nur, wenn das Socket geschlossen wird Netzwerkprogrammierung 53
P server - client verbindung (anfänger) Netzwerkprogrammierung 8
S Socket (client) verbindet nicht Netzwerkprogrammierung 6
V Templates für Java Client rabbitmq Netzwerkprogrammierung 4
J Client Server - Serialisierung Netzwerkprogrammierung 8
C Client connection per Portforwarding auf einen lokalen Serverport Netzwerkprogrammierung 3

Ähnliche Java Themen

Neue Themen


Oben