# Server Socket Start / Stop



## precoc (17. Okt 2012)

Ich habe zwei Buttons in meiner GUI einmal den Start Button ( der den Server Socket öffnet und per Thread start() am Port wartet auf einen Eingangs Stream) und den Stop Button der den Server Socket schließen soll, der geöffnet wurde. Hier nun der Ablauf :
1. Programm wird gestartet, GUI / Fenster öffnet sich
2. dürcke auf Start Button, Server Socket wird geöffnet und Methode listenPortOnce() wird gestartet 
3. Son nun möchte ich den Server Socket mit dem Stop Button schließen, hier kommt noch kein Fehler und der Server Socket scheint geschlossen zu sein
4. Will ich nun aber den Server Socket wieder starten und drücke auf den Start Button, bekomme ich folgenden Fehler:

Exception in thread "AWT-EventQueue-0" java.lang.IllegalThreadStateException
	at java.lang.Thread.start(Unknown Source)
	at de.window.MyWindow.actionPerformed(MyWindow.java:41)
	at java.awt.Button.processActionEvent(Unknown Source)
	at java.awt.Button.processEvent(Unknown Source)
	at java.awt.Component.dispatchEventImpl(Unknown Source)
	at java.awt.Component.dispatchEvent(Unknown Source)
	at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
	at java.awt.EventQueue.access$200(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.awt.EventQueue$3.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.awt.EventQueue$4.run(Unknown Source)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(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)

und der Server Socket wird nicht wieder gestartet! .. Folgend nun der Code:

Die Action Events der Buttons

```
@Override
	public void actionPerformed(ActionEvent e) {
		/*///////////////////////////////////////////////////////////////
		 * Button Start
		 *//////////////////////////////////////////////////////////////
		if(e.getActionCommand().equals("start")){
			int port = Integer.parseInt(portNumber.getText());
			
			rH.startReceivePort(port);
			konsole.setText(konsole.getText() + "Server gestartet.." + "\n");
			rH.start();
			konsole.setText(konsole.getText() + "Server Port "+ port + " gestartet.." + "\n");
			
		}
		
		/*///////////////////////////////////////////////////////////////
		 * Button Stop
		 *//////////////////////////////////////////////////////////////
		if(e.getActionCommand().equals("stop")){
			rH.closeReceivePort();
			konsole.setText(konsole.getText() + "Server gestopt.." + "\n");
		}
	}
```

über die Methode rH.start() wird die methode rH.run() aufgerufen und in dieser wird listenPortonce() der selben Klasse aufgerufen 

Klassen Kopf 

```
public class receiverHost extends Thread{
```

Methode listenPortOnce()

```
public boolean listenPortOnce(){
    while (true  ) {
            try {
                 this.contentPaket = this.server.accept();
                 if(this.MSG == 1) System.out.println("Listen on Port..." + this.receivePort);
                 if(this.MSG == 1) System.out.println(readContent());
                
                 return true;
            } catch (IOException e) {
                //if(this.ERR == 1)System.err.println("IOEx1...");
               //if(ERR == 1)e.printStackTrace();
                return false;
            }
        }
    }
```

zu guter letzt die Methode die über den Stop Button aufgerufen wird closeReceivePort()

```
public void closeReceivePort(){
        if (this.server != null){
            try {
                this.server.close();
                if(this.ERR == 1)System.out.println("Close Receive Port... " + this.receivePort);          
            } catch (IOException e) {
                if(this.ERR == 1)System.err.println("Port nicht zu schliessen...");
                if(this.ERR == 1)e.printStackTrace();               
            }
        }else{
            if(this.ERR == 1)System.err.println("Kein Port wurde geöffnet...");
        }
 
    }
```

Ich möchte einfach nur wissen wie ich beliebig oft den Server Starten und Stopen kann und dies nicht nur einmal pro Lebensdauer eines Fensters.

zur weiteren Erklärung, die Methode rH.startReceivePort(port); startet den Server Socket 

und die Methode readContent() liest den Inptutstream in eine String.

Hoffentlich versteht man mein Problem, ich bin noch neu in der Java Programmierung, also seid bitte gütig zu mir!


----------



## Michael... (17. Okt 2012)

Kann es sein, dass Du den selben Thread versuchst nochmal zu starten? Das geht nicht, ein Thread kann nur einmal ausgeführt werden, Du müsstest einen neuen Thread erzeugen. Besser als "extends Thread" wäre "implements Runnable". Das Runnable Objekt könntest Du im neuen Thread einfach wiederverwenden.
Wie stoppst Du denn das ganze? Deine Schleife in der listenPortOnce() ist ja eine Endlosschleife.
Je nachdem wie sauber man das ganze machen will, könnte man aus einem anderen Thread ein close() auf das ServerSocket aufrufen, um das blockierende accept() abzubrechen - dabei wird allerdings eine IOException geworfen. Beim "Neustarten" erzeugt man einfach ein neues ServerSocket und geht dann wie gehabt in die accept() Schleife.


----------



## precoc (17. Okt 2012)

danke, das werde ich mal versuchen..


----------



## precoc (17. Okt 2012)

Meinst du auf diese Art einen neuen thread Starten?


```
new Thread(
    new Runnable() {
        @Override
        public void run() {
        /*
          inhalt des neuen Threads
          rH.listenPortOnce()
        */
}
}
)
```

an der stelle wo jetzt rH.start() steht ?


----------



## Michael... (17. Okt 2012)

z.B. wobei es ausreichen würde nur einen neuen Thread zu erstellen. Das Runnable Objekt könnte einmal erstellt und immer wieder verwendet werden.


----------



## precoc (17. Okt 2012)

Hat funktioniert  danke für die Hilfe!!


----------

