# Socket close



## Gast2 (31. Okt 2007)

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.

```
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)
```



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


----------



## SlaterB (31. Okt 2007)

wegen out.close(); 








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


----------



## Gast2 (31. Okt 2007)

```
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


----------



## SlaterB (31. Okt 2007)

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


----------



## Gast2 (31. Okt 2007)

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


----------



## SlaterB (31. Okt 2007)

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


----------



## Gast2 (31. Okt 2007)

also das passiert in meiner GUI


```
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

```
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


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


----------



## Gast2 (1. Nov 2007)

noch mehr code???


----------



## SlaterB (1. Nov 2007)

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


----------



## Dante (1. Nov 2007)

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.


----------



## Gast2 (1. Nov 2007)

@ 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


----------



## SlaterB (2. Nov 2007)

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


----------



## Gast2 (2. Nov 2007)

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 =)


```
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


```
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
	
	
	
	





```
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 =)


----------



## SlaterB (2. Nov 2007)

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..  )


----------



## Gast2 (2. Nov 2007)

ok alles klar habs hinbbekommen thx


----------

