Client stürzt bei Socket ab



  • 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?

    MfG SideWinder



  • Das komische ist ja das es nur bei dieser I-net verbindung fehlschlägt. Aber hier mal die zwei wichtigsten Klassen

    web_sync.java:

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

    Server_Thread.java:

    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());
         }
       }
     }
    


  • Minimiere den Code auf das Nötigste.



  • Da ich selber nicht weis wo ich ansetzen könnte und es bei mir ja funktioniert, ist ein reduzieren sehr schwierig. Hoffe mal dass ich nicht zuviel rauseditiert habe.



  • 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);
         	}
    
       }
     }
    

    Server_Thread.java:

    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());
         }
       }
     }
    


  • Ich habs jetzt nicht so genau durchgelesen, aber was machst du da mit der Dateigröße? %200 /200%200 *200 ... bis du sicher, dass das funktioniert?



  • Ja bin mir sicher, denn
    1. fonktioniert mein code, der die Größe einer int-Vaiable einfach auf einzelne Zeichen aufteilt (klar könnte auch int übertragen, kam aber erst später drauf)

    2. dürfte wenn das schiefgeht vielleicht Unsinn ankommen, aber niemals der TCP/IP Stack vom Sender (also Client) abstürzen.



  • Bis wohin kommt er?

    Übrigens find ich deinen Code sehr hässlich. Kannst du das nicht ein bisschen schöner in Funktionen packen?



  • Der Code ist daraus entstanden, dass ich alle unnützen Funktionen entfrent, und das notwedigste in einer Klasse zusammengefasst habe - wobei sich das ja jeder hier auch denken kann.

    Und wer aufmerkasm liest bemerkt auch, dass der Sender (Client) seinen Code komplett abarbeitet und dann "hängt", der Empfänger (Server) empfängt nach meinen Tests genau 2 Bytes und wartet dann endlos (Programm und Rechner laufen Problemlos weiter).



  • Dann wirds wohl nicht an Java liegen sondern an Windows 95.



  • was passiert, wenn du dne socket nicht so früh schließt?



  • zrt schrieb:

    was passiert, wenn du dne socket nicht so früh schließt?

    Wie kann ich sowas realisieren (also warten bevor Socket schlißen)?



  • Wenns nur zum testen sein soll
    Thread.sleep(1000000);



  • Es ist übrigens kein guter Stil, in den GUI-Callbacks dermaßen umfangreiches Zeug zu erledigen. Komm' also später nicht wieder und erzähl' uns was von "Java ist langsam!" oder "Die GUI reagiert gar nicht mehr!"... 😉



  • Swing ist langsam.



  • Sgt. Nukem schrieb:

    Es ist übrigens kein guter Stil, in den GUI-Callbacks dermaßen umfangreiches Zeug zu erledigen. Komm' also später nicht wieder und erzähl' uns was von "Java ist langsam!" oder "Die GUI reagiert gar nicht mehr!"... 😉

    keine sorge, da das tool für mich ist, weis ich was passiert wenn einer drückt



  • Nächstes mal bitte mit angeben wenn du cosspostest: http://www.java-forum.org/de/viewtopic.php?p=171220


Anmelden zum Antworten