Socket close

Netzwerkeprogrammierung: Socket close

Fragen zu Client-/Server-Programmierung sowie zu verteilten Anwendungen (RMI, CORBA etc.)
12
  1. Socket close #1
    Gast2

    Socket close - Standard 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. Socket close #2
    SlaterB

    wegen out.close();








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

  3. Socket close #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. Socket close #4
    SlaterB

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

  5. Socket close #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. Socket close #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. Socket close #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. Socket close #8
    Gast2

    noch mehr code???

  9. Socket close #9
    SlaterB

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

  10. Socket close #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.

12
Ähnliche Themen zu Socket close
  1. Socket schließen mit .close()
    Von socialcocer im Forum Netzwerkeprogrammierung
    Antworten: 4
    Letzter Beitrag: 12.04.2011, 15:18
  2. close() Socket Verbindung nötig ?
    Von jupa im Forum Netzwerkeprogrammierung
    Antworten: 3
    Letzter Beitrag: 19.02.2008, 15:37
  3. socket.close() Problem ----- java.net.BindException
    Von jogomu im Forum Netzwerkeprogrammierung
    Antworten: 4
    Letzter Beitrag: 23.06.2006, 07:58
  4. ObjectOutputStream + Socket close
    Von cluening im Forum Netzwerkeprogrammierung
    Antworten: 6
    Letzter Beitrag: 17.02.2006, 10:23
Sie betrachten gerade Socket close