Server kann nicht beendet werden

Sanagarth

Grünschnabel
Hallöchen alle zusammen,

hab nen kleines Problem wie könnte es auch anders sein.

Also ich starte aus meiner Gui per Knopfdruck einen Thread ( Server )
hab in meine run Methode ne while schleife rein gehauen.
while(serverisrunning) // boolean wert
{
// warte auf Daten
}

nun hab ich das Problem das ich dem User die Möglichkeit geben möchte den Server neuzustarten, zu beenden, überhaupt zu starten.

Das starten war kein Problem. Nur jedes mal wenn ich den Server beenden will passiert nichts.

Beenden Methode:
Code:
try 
{
   System.out.print("bye");
   ser.stopthread(false); // setzt die Variable serverisrunning auf false
    ser.join(); // ser = Objekt vom Typ Server ( objekt hat run methode erbt von Thread ) 
}
catch(Exception ex) {
System.out.print("ex"+ex);
}
System.out.println("Server down");

Wenn ich den Beenden button drück siehe Methode oben gibt er mir auch alles aus nur wenn ich den Server neu starten möchte ( neues Server objekt, also neuer Thread )
bekomme ich den Error:

Server konnte nicht gestartet werden java.net.BindException: Address already in use: JVM_BindServer ist down

Was mach ich falsch ?

Liebe Grüße & danke im Vorraus

Sana
 
Schliesst du vor dem Beenden des Threads auch alle Sockets etc? Ansonsten könnte der Port nocht blockiert sein und dann kann kein neuer Server gestartet werden.
 
Hallo alle miteinander,


ich hab jetzt zwar noch nicht ausprobiert. Aber ich glaub ich bin der Lösung etwas näher gekommen. Da ich den Server komplett in nen Thread gepackt habe wurde der Socket immer noch blockiert. Versuche morgen abend mal den Server auszulagern und für diesen nen eigenen Thread schreiben. Würde mich einfach morgen nochmal schreiben aber erstmal danke für die Hilfe.

Bisher wurden die Socket und der Thread mit folgender Methode geschlossen:

Code:
	public void stopthread()
	{
		try
		{
			this.interrupt();
		socket.close();
		socket = null;
		listener.close() ;
		listener=null;
		
		}
		catch(Exception ex)
		{
			
		}
	}
Gibt es noch andere Methoden Threads zu killen außer die Methode interrupt();
Da die meisten Methoden will "kill" oder "close" ja alle deprecated sind.



Der jetzige Server:
Code:
	public synchronized  void run() 
	{
		try 
		{
			 listener = new ServerSocket(port);
				// ServerSocket server = new ServerSocket(60120);
				 // ServerSocket erzeugen...
			
				//listener.bind(inetsocket); // und an einen lokalen Port binden
				System.out.println("Server running...");
				 socket = listener.accept(); // Warten bis jemand anklopft
				try {
					// PrintWriter mit autoFlush erzeugen (Ausgaben sofort senden)
					PrintWriter pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
					// Reader für gepufferte Eingabe erzeugen (Ganze Zeilen lesen)
					BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));
					System.out.println("Connected to " + socket.getInetAddress());
					pw.println("Hello, " + socket.getInetAddress());

					while (isrunning) 
					{
						String message = br.readLine(); // lauschen...
						if (!message.equals("bye")) { // ...und wenn nicht am Ende...
							System.out.println("< " + message); // ...Ausgabe und...
							pw.println(message); // ...echo zurück...
							pw.write("gear");
						} else {
							break;                      // ...sonst Ende
						}
					}
					pw.println("bye");
					socket.close();
				} catch (IOException ex) {
					System.err.println("Communication error: " + ex.getMessage());
				}
				listener.close();
				System.out.println("Server down");
		}
		catch (IOException ex)
		{
			System.out.print("Server konnte nicht gestartet werden ");
			System.out.print("EX "+ex);
		}
		System.out.print("Server ist down");
	}



Ich denk der knackpunkt liegt in diesem Aufruf:
socket = listener.accept();
da hier ja der Socket gebunden wird.

Wenn ich jetzt alles folgende in einen eigenen Thread packe müsste es eigentlich klappen?

oder was meint ihr ?

Liebe grüße

sana
 
Zuletzt bearbeitet:
Zurück