Hallo zusammen,
ich bin gerade dabei in Java einen kleinen und simplen Webserver zu basteln, der für ein Plugin in einem Craftbukkit Server verwendet werden soll. Das ganze ist einfach eine Spielerei um ein wenig mehr in Sachen Sockets und Threads zu lernen.
Mein Problem dabei ist nur, dass sich der ServerSocket und der Instance-Thread in der Quere kommen. Möchte ich den Server neu starten, wartet der Thread nicht bis die Socket Verbindung geschlossen ist, und rennt in eine BindException (Already in use) rein.
Den Sourcecode gibts in meinem GIT Repo: Anwendungsentwickler Gitweb - java/webserver.git/tree - src/ (Commit 120b9a0536bdead44f77e907176084a7050be455)
Dateien
Mein Problem ist jetzt wie gesagt, dass wenn ich ein "restart" ausführe und bei [c]WebserverInstance.stopInstance()[/c] das [c]Thread.sleep() [/c]wegnehme, nicht gewartet wird, bis der ServerSocket korrekt geschlossen wurde.
[JAVA=69]public void stopInstance() throws InterruptedException, IOException {
this.interrupt();
this.threadPool.shutdown();
try { this.threadPool.awaitTermination(10,TimeUnit.SECONDS); } catch(Exception e) { }
this.threadPool = null;
if(this.serverSocket!=null) {
this.serverSocket.setReuseAddress(true);
try { this.serverSocket.close(); } catch(Exception ex) { ex.printStackTrace(); }
this.serverSocket=null;
Thread.sleep(200); // Hack to wait for ServerSocket close
}
}[/code]
Würde mich auf Hinweise und ein bisschen Kritik zum Sourcecode allgemein sehr freuen.
Viele Grüße
Christian
ich bin gerade dabei in Java einen kleinen und simplen Webserver zu basteln, der für ein Plugin in einem Craftbukkit Server verwendet werden soll. Das ganze ist einfach eine Spielerei um ein wenig mehr in Sachen Sockets und Threads zu lernen.
Mein Problem dabei ist nur, dass sich der ServerSocket und der Instance-Thread in der Quere kommen. Möchte ich den Server neu starten, wartet der Thread nicht bis die Socket Verbindung geschlossen ist, und rennt in eine BindException (Already in use) rein.
Den Sourcecode gibts in meinem GIT Repo: Anwendungsentwickler Gitweb - java/webserver.git/tree - src/ (Commit 120b9a0536bdead44f77e907176084a7050be455)
Dateien
- main/SrvTest.java
Main Programm mit kleiner CMD zum starten und stoppen. - ws/anwendungsentwickler/java/webserver/BasicWebserverListener.java
Kann mit Webserver.registerListener() zur Verarbeitung eines Requests registriert werden. - ws/anwendungsentwickler/java/webserver/Webserver.java
Basisklasse des Webservers. Hier wird der Thread WebserverInstance erstellt. - ws/anwendungsentwickler/java/webserver/WebserverInstance.java
In der Klasse wird auf neue Anfragen gehorcht und in separaten Threads verarbeitet. - ws/anwendungsentwickler/java/webserver/WebserverRequestHandler.java
Wird als Thread von WebserverInstance gestartet um die Requests zu verarbeiten.
Mein Problem ist jetzt wie gesagt, dass wenn ich ein "restart" ausführe und bei [c]WebserverInstance.stopInstance()[/c] das [c]Thread.sleep() [/c]wegnehme, nicht gewartet wird, bis der ServerSocket korrekt geschlossen wurde.
[JAVA=69]public void stopInstance() throws InterruptedException, IOException {
this.interrupt();
this.threadPool.shutdown();
try { this.threadPool.awaitTermination(10,TimeUnit.SECONDS); } catch(Exception e) { }
this.threadPool = null;
if(this.serverSocket!=null) {
this.serverSocket.setReuseAddress(true);
try { this.serverSocket.close(); } catch(Exception ex) { ex.printStackTrace(); }
this.serverSocket=null;
Thread.sleep(200); // Hack to wait for ServerSocket close
}
}[/code]
Würde mich auf Hinweise und ein bisschen Kritik zum Sourcecode allgemein sehr freuen.
Viele Grüße
Christian
Zuletzt bearbeitet: