Thread beenden und neu starten

4by4

Mitglied
hey leute

könnte mir jmd bei folgendem problem bitte helfen:

ich habe einen server der vom benutzer gestartet wird. Währen der Server läuft kann der benutzer einstellungen vornehmen. unter anderem den port des servers ändern. um die einstellung wirksam zu machen muss nun der server neugestartet werden.
kenn mich leider mit threads net so gut aus

Java:
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server extends Thread {

	private boolean running;
	private int port;
	private ServerSocket server;
	private Socket client;
	private ObjectInputStream in;
	private ObjectOutputStream out;
	private ServerHandler handler;

	public Server( ServerHandler handler ) {
		this.running = false;
		this.port = 4711;
		this.server = null;
		this.client = null;
		this.in = null;
		this.out = null;
		this.handler = handler;
	}

	public String getStatus() {
		if ( running ) return "started";
		else return "stopped";
	}

	public void run() {
		running = true;
		System.out.println("Server started");
		while ( !isInterrupted() ) {
			try {
				server = new ServerSocket( port );
				System.out.println("Server is connected on port: " + port);
				System.out.println("Waiting for client...");
				client = server.accept();
				if ( client != null ) {
					out = new ObjectOutputStream( client.getOutputStream() );
					in = new ObjectInputStream( client.getInputStream() );
					while ( !isInterrupted() ) {
						out.writeObject( handler.getResponse( in.readObject() ) );
					}
				}
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
		running = false;
		try {
			if ( in != null )
				in.close();
			if ( out != null )
				out.close();
			if ( client != null )
				client.close();
			server.close();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}

	public int getPort() {
		return port;
	}

	public void setPort(int port) {
		this.port = port;
	}
}

und

Java:
if(server.getStatus().equals("started")) {
					try {
						server.interrupt();
					} catch (Exception e) {
						e.printStackTrace();
					}
				}				
				else 
					server.start();
				break;
cheers
 
Hellas!

Du kannst die start-Methode eines Threads nicht zweimal aufrufen. Du könntest Deine Server-Klasse so umschreiben, dass sie nicht von Thread erbt sondern nur das Interface Runnable implementiert.

Dann erstellst Du dir zB eine Methode startServer wo Du folgendes machst:

Java:
public void startServer() {
  serverThread = new Thread(this);
  serverThread.start();
}

Und dann eine Methode restart(), zB:

Java:
public void stopServer() {
  if(serverThread != null) {
    serverThread.interrupt();
    serverThread.join();
    serverThread = null;
  }
}

public void restartServer() {
  stopServer();
  startServer();
}
 
Zuletzt bearbeitet von einem Moderator:
Funktioniert obwohl ich ein Exception bekomme
Java:
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.ServerSocket;
import java.net.Socket;

public class Server implements Runnable {

	private int port;
	private ServerSocket server;
	private Socket client;
	private ObjectInputStream in;
	private ObjectOutputStream out;
	private ServerHandler handler;
	private Thread serverThread;

	public Server( ServerHandler handler ) {
		this.port = 4711;
		this.server = null;
		this.client = null;
		this.in = null;
		this.out = null;
		this.handler = handler;
	}

	public void startServer() {
		serverThread = new Thread(this);
		serverThread.start();
	}
	public String getStatus() {
		if (serverThread == null) return "stopped";
		else if (!serverThread.isInterrupted()) return "started";
		else return "stopped";
	}
	
	public void restartServer() throws Exception {
		stopServer();
		startServer();
	}

	private void closeConnection() throws Exception {
		if( out != null )
			out.close();
		if( in != null )
			in.close();
		if( client != null)
			client.close();
		if( server != null)
			server.close();
	}
	public void stopServer() throws Exception {
		if(serverThread != null) {
			closeConnection();
			serverThread.interrupt();
			serverThread.join();
			serverThread = null;
		}
	}
	public void run() {
		System.out.println( "Server started" );
		while ( !serverThread.isInterrupted() ) {
			try {
				server = new ServerSocket( port );
				server.setSoTimeout(5000);
				System.out.println( "Server is connected on port: " + port );
				System.out.println( "Waiting for client..." );
				client = server.accept();
				out = new ObjectOutputStream( client.getOutputStream() );
				in = new ObjectInputStream( client.getInputStream() );
				while ( !serverThread.isInterrupted() ) {
					out.writeObject( handler.getResponse( in.readObject() ) );
				}
				closeConnection();
			} catch (Exception e) {
				e.printStackTrace();
			}
		}
	}

	public int getPort() {
		return port;
	}

	public void setPort(int port) {
		this.port = port;
	}
}

Exception
Java:
Server **********************
Server settings (e)
Server: stopped (s)
s

Server **********************
Server settings (e)
Server: started (s)
Server started
Server is connected on port: 4711
Waiting for client...
s
java.net.SocketException: Socket operation on nonsocket: configureBlocking

Server **********************
Server settings (e)
Server: stopped (s)
	at java.net.DualStackPlainSocketImpl.configureBlocking(Native Method)
	at java.net.DualStackPlainSocketImpl.socketAccept(Unknown Source)
	at java.net.AbstractPlainSocketImpl.accept(Unknown Source)
	at java.net.PlainSocketImpl.accept(Unknown Source)
	at java.net.ServerSocket.implAccept(Unknown Source)
	at java.net.ServerSocket.accept(Unknown Source)
	at sesp_1213.group_11.orderapp_server.socket.Server.run(Server.java:70)
	at java.lang.Thread.run(Unknown Source)
 

Neue Beiträge

Zurück