G
Guest
Gast
Hab hier einen Server und einen Client die sich jeweils beide beliebig beenden lassen (soll auch so sein).
Folgendes Problem:
Wenn vor beenden der Verbindung der Client mit dem Server verbunden war, dann funktioniert alles.
Wenn ich aber vor Verbindungsaufbau den Server beende und dann versuche eine neue Verbindung aufzubauen, dann kommt bekomme ich folgendes:
java.net.BindException: Address already in use: JVM_Bind
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(Unknown Source)
at java.net.ServerSocket.bind(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
Hab schon etwas gesucht und gefunden, dass der man nur einen ServerSocket pro Port erstellen kann.
Hier ist ein älterer Bug bei dem der selbe Fehler auftritt: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4492308
Wenn ich einen Verbindungsversuch mit dem Server starte ohne vom Client aus eine Verbindung aufzubauen, dann haengt der ServerSocket an server.accept() und wartet. Wenn nun der Server beendet wird und ein neuer Verbindungsversuch gestartet wird, dann konnte natuerlich nach accept() nichts weiteres mehr ausgefueht werden und der Code laeuft erst wieder bis zu accept() ab. Ich kann kein close() nach accept() aufrufen, da das ja nur aufgerufen wird, wenn eine Verbindung aufgebaut wurde. Davon abgesehen waere es ja sinnlos direkt nach Verbindungsaufbau close() aufzurufen. Bei dem neuen Verbindungsversuch ist also der "alte" ServerSocket noch offen und blockiert den port.
Ich muesste glaube ich close() vor dem Erstellen des ServerSockets aufrufen (beim ersten mal koennte ich dann einfach die NullPointerException abfangen), das geht aber in meinem Fall nicht, da der Server in einer Klasse liegt von der bei jeder neuen Verbindung eine Instanz erzeugt wird und der ServerSocket eine Klassen"variable" ist.
Gibt es vielleicht eine Moeglichkeit von einer anderen Klasse aus accept() vorzeitig zu beenden bzw. zu ueberspringen und dann close() aufzurufen, ohne dass vorher eine Verbindung aufgebaut wurde?
Folgendes Problem:
Wenn vor beenden der Verbindung der Client mit dem Server verbunden war, dann funktioniert alles.
Wenn ich aber vor Verbindungsaufbau den Server beende und dann versuche eine neue Verbindung aufzubauen, dann kommt bekomme ich folgendes:
java.net.BindException: Address already in use: JVM_Bind
at java.net.PlainSocketImpl.socketBind(Native Method)
at java.net.PlainSocketImpl.bind(Unknown Source)
at java.net.ServerSocket.bind(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
at java.net.ServerSocket.<init>(Unknown Source)
Hab schon etwas gesucht und gefunden, dass der man nur einen ServerSocket pro Port erstellen kann.
Hier ist ein älterer Bug bei dem der selbe Fehler auftritt: http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4492308
Wenn ich einen Verbindungsversuch mit dem Server starte ohne vom Client aus eine Verbindung aufzubauen, dann haengt der ServerSocket an server.accept() und wartet. Wenn nun der Server beendet wird und ein neuer Verbindungsversuch gestartet wird, dann konnte natuerlich nach accept() nichts weiteres mehr ausgefueht werden und der Code laeuft erst wieder bis zu accept() ab. Ich kann kein close() nach accept() aufrufen, da das ja nur aufgerufen wird, wenn eine Verbindung aufgebaut wurde. Davon abgesehen waere es ja sinnlos direkt nach Verbindungsaufbau close() aufzurufen. Bei dem neuen Verbindungsversuch ist also der "alte" ServerSocket noch offen und blockiert den port.
Ich muesste glaube ich close() vor dem Erstellen des ServerSockets aufrufen (beim ersten mal koennte ich dann einfach die NullPointerException abfangen), das geht aber in meinem Fall nicht, da der Server in einer Klasse liegt von der bei jeder neuen Verbindung eine Instanz erzeugt wird und der ServerSocket eine Klassen"variable" ist.
Gibt es vielleicht eine Moeglichkeit von einer anderen Klasse aus accept() vorzeitig zu beenden bzw. zu ueberspringen und dann close() aufzurufen, ohne dass vorher eine Verbindung aufgebaut wurde?