Guten Tag,
ich arbeite gerade an einem Programm, welches quasi als Server laeuft und ueber Netzwerk-Sockets angesprochen werden soll. Dazu habe ich einen Thread mit einem ServerSocket, der auf eingehende Verbindungen wartet. Kommt eine, wird eine Connection geoeffnet und ueber die kann man dann kommunizieren.
Nun moechte ich aber auch die Moeglichkeit haben, dass die komplette Anwendung auch ueber diesen Socket beendet werden kann. Sauber natuerlich. Allerdings weiss ich nicht so ganz, wie ich das am schlauesten anstellen soll. Im Moment sieht es so aus, dass der Server der Connection sich selbst mitgibt und die Moeglichkeit bietet, den ServerSocket zu schliessen. Da der Server allerdings derweil schon wieder an selbigem auf die naechste Verbindung wartet, wird hier eine Exception geworfen... damit wuerde ich praktisch Exceptions zur "Flow Control" missbrauchen, was ich gar nicht schoen finde.
Ganz grob skizziert ists grad so:
main:
Server:
Connection:
Vielleicht hat da jemand einen besseren Ratschlag fuer mich. :/
ich arbeite gerade an einem Programm, welches quasi als Server laeuft und ueber Netzwerk-Sockets angesprochen werden soll. Dazu habe ich einen Thread mit einem ServerSocket, der auf eingehende Verbindungen wartet. Kommt eine, wird eine Connection geoeffnet und ueber die kann man dann kommunizieren.
Nun moechte ich aber auch die Moeglichkeit haben, dass die komplette Anwendung auch ueber diesen Socket beendet werden kann. Sauber natuerlich. Allerdings weiss ich nicht so ganz, wie ich das am schlauesten anstellen soll. Im Moment sieht es so aus, dass der Server der Connection sich selbst mitgibt und die Moeglichkeit bietet, den ServerSocket zu schliessen. Da der Server allerdings derweil schon wieder an selbigem auf die naechste Verbindung wartet, wird hier eine Exception geworfen... damit wuerde ich praktisch Exceptions zur "Flow Control" missbrauchen, was ich gar nicht schoen finde.
Ganz grob skizziert ists grad so:
main:
Code:
Server server = new Server();
server.start();
Server:
Code:
public class Server extends Thread {
private ServerSocket serverSocket;
@Override
public synchronized void run() {
try {
serverSocket = new ServerSocket(31337);
while(true) {
System.out.println("accepting");
Socket socket = serverSocket.accept();
System.out.println("new connection");
Thread connection = new Connection(socket, this);
connection.start();
System.out.println("started");
}
} catch (IOException e) {
System.err.println("server exiting\n");
// ja nu is der Server halt beendet, aber toll ist das ja nicht
return;
}
}
public ServerSocket getServerSocket() {
return serverSocket;
}
}
Connection:
Code:
public class Connection extends Thread {
private Socket socket;
private BufferedReader in = null;
private BufferedWriter out = null;
private Server server;
public Connection(Socket socket, Server server) {
this.socket = socket;
this.server = server;
}
@Override
public synchronized void run() {
try {
in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
out = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
boolean continueThread = true;
while(continueThread) {
out.write("prompt: ");
out.flush();
String line = in.readLine();
System.out.println(socket.getPort() + " " + line);
if(line.equals("exit")) {
continueThread = false;
} else {
continueThread = parseLine(line);
}
if(!continueThread) {
in.close();
out.close();
socket.close();
break;
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
private boolean parseLine(String line) {
try {
if(line.equals("shutdown")) {
out.write("shutting down...\n");
out.flush();
server.getServerSocket().close(); // hier wird der Server getoetet...
return false;
}
} catch (SchedulerException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
}
Vielleicht hat da jemand einen besseren Ratschlag fuer mich. :/