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().


Anmelden zum Antworten