Probleme beim beenden eines Socket Servers
-
Hallo,
ich bin dabei ein Client Server anwendung zu programmieren. Ich habe schon den Server und acuh den Client. Es ist auch möglich sich mit dem Server zu verbinden.
Ich möchte aber den Server auch wieder beenden. Ich zeigen euch mal meinen Code :Server :
@Override public void run(){ try { startConnectionToClients(); } catch (Exception e) { e.printStackTrace(); } while (startClientConnection == true){ System.out.println("Running Server"); } System.out.println("Stop Server"); } @Override public void startConnectionToClients() throws Exception { System.out.println("Set Timeout"); // set the timeout //this.gameServerSocket.setSoTimeout(gameServerConnectTimout); System.out.println("Wait for client connection1"); // wait for client connection this.gameClientConnection1 = this.gameServerSocket.accept(); System.out.println("Wait for client connection2"); // wait for client connection this.gameClientConnection2 = this.gameServerSocket.accept(); if ((gameClientConnection1 != null) && (gameClientConnection2 != null)){ this.startClientConnection = true; } } public void closeConnectionToClients() throws Exception{ this.startClientConnection = false; if ((gameClientConnection1 != null) && (gameClientConnection2 != null)){ this.gameClientConnection1.close(); this.gameClientConnection2.close(); } }
Wenn ich den Server starte und die beiden Clients sich verbinden, bekomme ich acuh die erwarteten Ausagben :
Set Timeout Wait for client connection1 Wait for client connection2 Running Server
Allerdings wenn ich den server stoppen :
server.closeConnectionToClients();
Dann bekomme ich nicht mehr die Ausgabe :
Stop Server
aus der run Methode.
Hat jemand eine Idee ?
Vielen Dank
-
1. Funktioniert das stoppen den?
2. Wieso gibst du den Text nicht in der Methode closeConnectionToClients aus?
-
Hallo Danke für deine Nachricht.
Ich glaube ich habe mich etwas falsch ausgedrückt :
Also Ich möchte eine Spiel starten -dann soll der Server gestartet werden.
Wenn das Spiel zu Ende ist, soll der Server beendet werden.
Wenn der Spieler ein neues Spiel startet, soll der Server auch zuerst beendet und dann neu gestartet werden,Das Problem liegt darin, wenn ich den Server ein zweites mal starte, bekomme ich eine Illegal Thread State Exception, weil der Server noch läuft. Aus diesem Grunde habe ich die Ausgabe in die run () Methode geschrieben, um zu sehen das der Server sich beendet..
Ich hoffe es war etwas verständlicher
Vielen Dank für die Hilfe
-
Ich nehme mal an du arbeitest hier mit threads?
Wäre vllt. hilfreich wenn du mal den Part vom Code postest wo du probierst den Server zu beenden.
Also, nicht die close Methode, sondern den Aufruf.
-
Danke für deine Antwort.
Ich verwednde das in einem JUnit Test :
private GameServer gameServer; private GameClient gameClient1, gameClient2; @Before public void setUp() throws Exception{ this.gameServer = GameServer.getGameServerInstance(); this.gameClient1 = new GameClient(); this.gameClient2 = new GameClient(); // start the server this.gameServer.start(); } @After public void tearDown() throws Exception{ // stop the server this.gameServer.closeConnectionToClients(); this.gameServer.close(); } @Test public void testServerConnectionBasicFlow(){ Exception exception = null; // connect client 1 to server try { gameClient1.startConnectionToServer(); } catch (Exception e) { exception = e; } assertNull(exception); // connect client 2 to server try { gameClient2.startConnectionToServer(); } catch (Exception e) { exception = e; } assertNull(exception); } @Test public void testServerConnectionTimout(){ Exception exception = null; //assertNotNull(exception); }
-
Soweit sehe ich eigentlich kein Problem, es sei den du erstellst in "gameServer.start()" ein anderes gameServer Objekt, und schliesst dieses anstatt das welches du eigentlich willst.
In closeConnectionToServer kommst du rein?
Du könntest sonst mal anstatt deinem Flag einen !Thread.currentThread.isInterrupted() als überprüfung verwenden, und in closeConnection Thread.currentThread.interrupt().