Socket close

Netzwerkeprogrammierung: Socket close



Erstellt von Gast2  |  Antworten: 14

  1. #1
    Gast2

    Socket close
    Hallo zusammen,

    Ich will etwas an meinen Server schicken, wenn ein Button gedrückt wurde. Klappt wunderbar doch beim 2ten mal bekomm ich eine Fehlermeldung.
    Code:
    java.net.SocketException: Socket is closed
    	at java.net.Socket.getOutputStream(Unknown Source)
    	at verleih.service.TestServer.senden(TestServer.java:99)
    	at verleih.Verwaltung.AnlegenCD.actionPerformed(AnlegenCD.java:102)
    	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    	at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
    	at java.awt.Component.processMouseEvent(Unknown Source)
    	at javax.swing.JComponent.processMouseEvent(Unknown Source)
    	at java.awt.Component.processEvent(Unknown Source)
    	at java.awt.Container.processEvent(Unknown Source)
    	at java.awt.Component.dispatchEventImpl(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Window.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.EventQueue.dispatchEvent(Unknown Source)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.run(Unknown Source)

    Code:
    	public static void senden(String nachricht,MEDCd cd) throws Exception
    	{
    		out =  new ObjectOutputStream(socket.getOutputStream());
    		out.writeObject(nachricht);
    		out.writeObject(cd);
    		out.flush();
    		closeStreams();
    		
    	}
    
    	public static void closeStreams()
    	{
    		
    			try {
    				if(sIn!=null)   sIn.close();
    				if(out!=null)	out.close();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		
    	}

    warum ist das Socket geschlossen????

  2. #2
    SlaterB

    wegen out.close();








    (welches auch den (die) unterliegenden Stream(s) schließt)

  3. #3
    Gast2

    Code:
    java.net.SocketException: Software caused connection abort: socket write error
    	at java.net.SocketOutputStream.socketWrite0(Native Method)
    	at java.net.SocketOutputStream.socketWrite(Unknown Source)
    	at java.net.SocketOutputStream.write(Unknown Source)
    	at java.io.ObjectOutputStream$BlockDataOutputStream.drain(Unknown Source)
    	at java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(Unknown Source)
    	at java.io.ObjectOutputStream.writeNonProxyDesc(Unknown Source)
    	at java.io.ObjectOutputStream.writeClassDesc(Unknown Source)
    	at java.io.ObjectOutputStream.writeOrdinaryObject(Unknown Source)
    	at java.io.ObjectOutputStream.writeObject0(Unknown Source)
    	at java.io.ObjectOutputStream.writeFatalException(Unknown Source)
    	at java.io.ObjectOutputStream.writeObject(Unknown Source)
    	at verleih.service.MEDServer.senden(MEDServer.java:101)
    	at verleih.Verwaltung.MEDAnlegenCD.actionPerformed(MEDAnlegenCD.java:102)
    	at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
    	at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
    	at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
    	at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
    	at java.awt.AWTEventMulticaster.mouseReleased(Unknown Source)
    	at java.awt.Component.processMouseEvent(Unknown Source)
    	at javax.swing.JComponent.processMouseEvent(Unknown Source)
    	at java.awt.Component.processEvent(Unknown Source)
    	at java.awt.Container.processEvent(Unknown Source)
    	at java.awt.Component.dispatchEventImpl(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
    	at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
    	at java.awt.Container.dispatchEventImpl(Unknown Source)
    	at java.awt.Window.dispatchEventImpl(Unknown Source)
    	at java.awt.Component.dispatchEvent(Unknown Source)
    	at java.awt.EventQueue.dispatchEvent(Unknown Source)
    	at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
    	at java.awt.EventDispatchThread.run(Unknown Source)
    ohne das close kommt beim 2ten mal das hier

  4. #4
    SlaterB

    erzeugst du immer noch 2x
    out = new ObjectOutputStream(socket.getOutputStream());
    ?
    tue das nicht,

  5. #5
    Gast2

    he und warum??? ich sende einmal und danach sende ich nochmal halt ein anderes Objekt sind das dann keine unterschiedlichen streams????ß

    also das heißt ich muss beim connecten einmal den output -und inputstream anlegen ???

  6. #6
    SlaterB

    so genau kann ich das nicht sagen, auch nicht testen,
    eher die Suche nach Möglichkeiten,

    allgemein ist zu empfehlen, mehr Code zu posten und funktionierende Beispiele aus Lehrbüchern anzuschauen,
    mit GUI sind die allerdings selten, stimmt

  7. #7
    Gast2

    also das passiert in meiner GUI

    Code:
    		public void actionPerformed(ActionEvent ae) 
    		{
    			if(ae.getSource()==btZuruck)
    			{
    				clearAngaben();
    			}
    			
    			if(ae.getSource()==btSpeichern)
    			{
    				cd=new MEDCd(Integer.parseInt(txtAnzahl.getText()),Float.parseFloat(txtPreis.getText()),txtBeschreibung.getText());
    				try {
    					MEDServer.senden("Nachricht1",cd);
    					
    					
    				} catch (Exception e) {
    					// TODO Auto-generated catch block
    					e.printStackTrace();
    				}
    			}
    
    		}
    Client seite
    Code:
                    public static void serverVerbindung() 
    	{
    		try {
    			//setServerVerbindungDaten();
    			adresse=InetAddress.getByName(ip);
    			socket= new Socket(adresse,port);
    
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    		
    	}
    
    	public static void senden(String nachricht,MEDCd cd) throws Exception
    	{
    		out =  new ObjectOutputStream(socket.getOutputStream());
    		out.writeObject(nachricht);
    		out.writeObject(cd);
    		out.flush();
    		//closeStreams();
    		
    	}
    serversetitig

    Code:
    	private static void verbindungClient()
    	{	
    
    	    MEDServer.debug("* ServerSocket initialsieren"); 
    	    try {
    			serverSocket=new ServerSocket(clientPort);
    		} catch (IOException e) {
    			MEDServer.debug("* ServerSocket fehgeschlagen initialsieren");
    			MEDServer.debug(e.getMessage());
    			e.printStackTrace();
    			return;
    		}
    		MEDServer.debug("* Server läuft*****:" +serverSocket);
    		MEDServer.debug("* PORT:" +clientPort);
    	
    	}
    
    	public static void waitForClient()
    	{	
    
    	    MEDServer.debug("* Warten bis eine Anfrage vom Client kommt"); 
    	    try
    	    {
    	    	while(true)
    			{
    				socket=serverSocket.accept();
    				MEDServer.debug("verbindung angenommen "+socket); 
    				new ServerThread(socket).start();
    			}
    	    }
    	    catch(Exception e)
    	    {
    	    	e.printStackTrace();
    	    }
    
    
    	}
    
    public class ServerThread extends Thread
    {
    
    	private Socket socket;
    	private ObjectOutputStream out;
    	private ObjectInputStream sIn;
    	
    	public ServerThread(Socket s)
    	{
    		socket=s;
    	}
    	
    	public void run() 
    	{ 
    		
    		try
    		{
    		    sIn= new ObjectInputStream (socket.getInputStream());
    		    out= new ObjectOutputStream(socket.getOutputStream());
    			String s=sIn.readObject().toString();
    			MEDServer.debug("Anfage " +s);
    			
    			if(s.equals("Nachricht1"))
    			{
    				MEDCd cd =(MEDCd) sIn.readObject();	
    				MEDServer.debug("Object:" );
    				MEDServer.debug("Nr: "+ cd.getNr());
    				MEDServer.debug("Beschreibung: "+cd.getBeschreibung() );
    				MEDServer.debug("Preis: "+cd.getPreis() );
    				MEDServer.debug("Anzahl:"+ cd.getAnzahl());
    			}		
    			out.writeObject("OK");
    			out.flush();
    			out.close();
    			sIn.close();
    		}
    		catch(Exception e)
    		{
    			e.printStackTrace();
    		}
    	} 
    }

  8. #8
    Gast2

    noch mehr code???

  9. #9
    SlaterB

    mein Vorschlag ist noch immer, nicht mehrere
    new ObjectOutputStream(socket.getOutputStream());
    zu erzeugen,

  10. #10
    Dante


    wenn du in einer methode eine (lokale) variable erzeugst, wird diese am ende der funktion gelöscht. Dabei wird der stream (der in dieser variable instanziert war) geschlossen und das schliesst rekursiv alles, was an diesem stream hing, also auch den socket

    daher solltest du eine art 'client' oder 'server' objekt bauen, das würde dann den socket und die streams kapseln und du kannst da drauf ne send-methode implementieren. dieses objekt kannst du dann an alle weitergeben die senden oder empfangen sollen.

  11. #11
    Gast2

    @ slater hab ich versucht ändert nichts daran... außerdem hab ich des new Object...... doch nur in meinem Thread wo soll ich es sonst initaliseren???ßVorschlag????(thx)

    @dante wo erzeug ich eine lokale variable????also ich seh keine!!!!
    Zu deinem 2ten : wenn ich die stream schließe ist auch das socket weg ok hab ich verstanden, ABER wenn ich es nicht schließe bekomm ich eine andere Exception....wie gesagt einmal funktioniert das ganze nur beim 2ten klicke klappt es nimmer...Aber ich finde keine lösung.....Ich werd ja wohl nicht der 1. sein, der ein objekt seinem server schicken will =) =) 2 mal hintereinander..

    EDIT: ich versuch grad ein Client und Server Objekt zu bauen hab doch drüber geschrieben was was ist.
    hab nur den wesentlichen Code geschickt .Z.B die DB-Verbidung usw. weiter gelassen

  12. #12
    SlaterB

    > @ slater hab ich versucht ändert nichts daran...

    na dann zeige mal den Code..

    > außerdem hab ich des new Object...... doch nur in meinem Thread
    du erzeugst bei jedem Aufruf der Operation senden() ein neues Stream-Objekt,

    > wo soll ich es sonst initaliseren???
    > out = new ObjectOutputStream(socket.getOutputStream());

    out scheint eine Exemplarvariable zu sein, socket auch,
    da wo socket gesetzt wird muss auch EINMALIG das out-Objekt gesetzt werden,
    in einem Konstruktor ähnlich

    > public class ServerThread extends Thread
    > {
    >
    > private Socket socket;
    > private ObjectOutputStream out;
    > private ObjectInputStream sIn;
    >
    > public ServerThread(Socket s)
    > {
    > socket=s;
    > }

    --------
    Dantes Einwand klingt dabei logischer,
    die alten Streams werden vielleicht automatisch geschlossen wenn sie gelöscht werden

    > @dante wo erzeug ich eine lokale variable????

    keine lokale, aber mehrmals eine Exemplarvaraible -> die alten Streams werden gelöscht


    > Zu deinem 2ten : wenn ich die stream schließe ist auch das socket weg ok hab ich verstanden, ABER wenn ich es nicht schließe bekomm ich eine andere Exception....

    hmm, auch nicht von der Hand zu weisen,
    in jedem Fall ist es sehr wahrscheinlich, dass es weniger Probleme gibt, wenn du nur einen Stream verwendest
    (wie wie gesagt in allen funktionieren Socket-Beispielen in dieser Welt, egal wo du hinschaust (nehme ich an ))

  13. #13
    Gast2

    ja ich verwende Streams einen Input und einen output ....Weiß nicht wie man es anders macht =)

    so jetzt schicke ich den aktuellen code nochmal wie er jetzt aussieht =)

    Code:
    public class Client
    {
    
    	private static InetAddress adresse;
    	private static String ip;
    	private static int port;
    	private static Socket socket;
    	private static ObjectInputStream sIn;
    	private static ObjectOutputStream out;
    	
    	public static void trennen() throws Exception
    	{
    		if(socket!=null) socket.close();
    
    	}
    	
    	public static void closeStreams()
    	{
    		
    			try {
    				if(sIn!=null)   sIn.close();
    				if(out!=null)	out.close();
    			} catch (IOException e) {
    				e.printStackTrace();
    			}
    		
    	}
    	
    	public static void serverVerbindung() 
    	{
    		try {
    			//setServerVerbindungDaten();
    			adresse=InetAddress.getByName(ip);
    			socket= new Socket(adresse,port);
    			out =  new ObjectOutputStream(socket.getOutputStream());
    			//sIn= new ObjectInputStream ( new ObjectInputStream (socket.getInputStream()));
    		} catch (Exception e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    
    		
    	}
    		
    	public static void senden(String nachricht) throws Exception
    	{
    		out.writeObject(nachricht);
    		out.flush();
    		//closeStreams();
    	}
    	
    	public static void senden(String nachricht,MEDCd cd) throws Exception
    	{
    		
    		out.writeObject(nachricht);
    		out.writeObject(cd);
    		out.flush();
    		//closeStreams();
    		
    	}
    
    	/* Die variante funktioniert
                    public static void senden(String nachricht,MEDCd cd) throws Exception
    	{
    		socket= new Socket(adresse,port);
    		out =  new ObjectOutputStream(socket.getOutputStream());
    		out.writeObject(nachricht);
    		out.writeObject(cd);
    		out.flush();
    		//closeStreams();
    		
    	}
    	*/
    
    
    }
    Server

    Code:
    	public static void waitForClient()
    	{	
    
    	    MEDServer.debug("* Warten bis eine Anfrage vom Client kommt"); 
    	    try
    	    {
    	    	while(true)
    			{
    				socket=serverSocket.accept();
    				MEDServer.debug("verbindung angenommen "+socket); 
    				new ServerThread(socket).start();
    			}
    	    }
    	    catch(Exception e)
    	    {
    	    	e.printStackTrace();
    	    }
    
    
    	}
    Thread
    Code:
    package server.DAO;
    
    import java.io.IOException;
    import java.io.ObjectInputStream;
    import java.io.ObjectOutputStream;
    import java.net.Socket;
    
    import server.gui.MEDServer;
    import server.service.MEDDatenBank;
    import verleih.DAO.MEDCd;
    
    public class ServerThread extends Thread
    {
    
    	private Socket socket;
    	private ObjectOutputStream out;
    	private ObjectInputStream sIn;
    	
    	public ServerThread(Socket s)
    	{
    		socket=s;
    	    try {
    			sIn= new ObjectInputStream (socket.getInputStream());
    			out= new ObjectOutputStream(socket.getOutputStream());
    		} catch (IOException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	   
    	}
    	
    	public void run() 
    	{ 
    		
    		try
    		{
    			String s=sIn.readObject().toString();
    			MEDServer.debug("Anfage " +s);
    			
    			if(s.equals("Nachricht1"))
    			{
    				MEDCd cd =(MEDCd) sIn.readObject();	
    				MEDServer.debug("Object:" );
    				MEDServer.debug("Nr: "+ cd.getNr());
    				MEDServer.debug("Beschreibung: "+cd.getBeschreibung() );
    				MEDServer.debug("Preis: "+cd.getPreis() );
    				MEDServer.debug("Anzahl:"+ cd.getAnzahl());
    			}		
    //			out.writeObject("OK");
    //			out.flush();
    //			out.close();
    //			sIn.close();
    //			socket.close();
    		}
    		catch(Exception e)
    		{
    			e.printStackTrace();
    		}
    	} 
    }

    Also jetzt passiert folgendes ich schicke einmal zum Server -->funktioniert schicke ein 2tes mal passiert nichts--> keine Fehlermeldung , aber es kommt auch nichts an =( =(

    EDIT steht im Client in kommentar die variante funktioniert... aber sieht unschön aus =)

  14. #14
    SlaterB

    im Server liest du nur einmal aus dem Socket,
    danach ignorierst du ihn, der Thread wird beendet

    -> baue eine Schleife in den Server!
    (zum x.ten Mal: schau dir doch einfach ein Dummy-Beispiel in einem Lehrbuch an.. )

  15. #15
    Gast2

    ok alles klar habs hinbbekommen thx


Keine Antwort auf Deine Suche gefunden? Registriere Dich kostenlos und stelle Deine eigene Frage zu Java!

Jetzt kostenlos registrieren