Fixed: new game after server crash
This commit is contained in:
@@ -47,16 +47,6 @@ public class RMIServer extends UnicastRemoteObject implements IGameServer {
|
||||
BlockingQueue<NetworkEvent> actionQueue;
|
||||
private LimitedMap<String, Boolean> playerList;
|
||||
|
||||
private boolean serverCrashed;
|
||||
|
||||
/**
|
||||
* Sets whether the server is recovering from a previous crash.
|
||||
*
|
||||
* @param serverCrashed {@code true} if the server is in crash-recovery mode,
|
||||
*/
|
||||
public void setServerCrashed(boolean serverCrashed) {
|
||||
this.serverCrashed = serverCrashed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Constructs an RMI server with the required game and network components.
|
||||
@@ -96,30 +86,25 @@ public class RMIServer extends UnicastRemoteObject implements IGameServer {
|
||||
if (preferredInt < 2 || preferredInt > 5) return false;
|
||||
|
||||
synchronized (controller) {
|
||||
if(serverCrashed)
|
||||
{
|
||||
if(controller.getModel().getPlayers().stream().anyMatch(p -> p.getUserName().equals(username))&& !playerList.containsKey(username)) {
|
||||
clients.put(username, callback);
|
||||
playerList.put(username, true);
|
||||
startWatchdog(username);
|
||||
System.out.println("(After crash)Reconnected player: " + username);
|
||||
return true;
|
||||
}
|
||||
|
||||
if (playerList.isEmpty() && controller.getModel()==null) {
|
||||
controller.setModel(new Game(preferredInt));
|
||||
playerList.setLimit(preferredInt);
|
||||
System.out.println("Game Created With :"+preferredInt+" Players");
|
||||
}
|
||||
else
|
||||
{
|
||||
if (playerList.isEmpty()) {
|
||||
controller.setModel(new Game(preferredInt));
|
||||
playerList.setLimit(preferredInt);
|
||||
System.out.println("Game Created With :"+preferredInt+" Players");
|
||||
}
|
||||
if (controller.addPlayer(username)) {
|
||||
clients.put(username, callback);
|
||||
playerList.put(username, true);
|
||||
startWatchdog(username);
|
||||
System.out.println("Accepted player: " + username);
|
||||
return true;
|
||||
}
|
||||
if (controller.addPlayer(username)) {
|
||||
clients.put(username, callback);
|
||||
playerList.put(username, true);
|
||||
startWatchdog(username);
|
||||
System.out.println("Accepted player: " + username);
|
||||
return true;
|
||||
}
|
||||
if(controller.getModel().getPlayers().stream().anyMatch(p -> p.getUserName().equals(username))&& !playerList.containsKey(username)) {
|
||||
clients.put(username, callback);
|
||||
playerList.put(username, true);
|
||||
startWatchdog(username);
|
||||
System.out.println("(After crash)Reconnected player: " + username);
|
||||
return true;
|
||||
}
|
||||
if (playerList.containsKey(username) && !playerList.get(username)) {
|
||||
playerList.put(username, true);
|
||||
@@ -279,13 +264,10 @@ public class RMIServer extends UnicastRemoteObject implements IGameServer {
|
||||
* on the specified port, and registers this server instance under the
|
||||
* {@code RMIGameServer} name.
|
||||
*
|
||||
* @param serverCrashed {@code true} if the server is being restarted after a crash,
|
||||
* {@code false} otherwise.
|
||||
* @return {@code true} if the server starts successfully,
|
||||
* {@code false} otherwise.
|
||||
*/
|
||||
public boolean start(boolean serverCrashed) {
|
||||
this.serverCrashed = serverCrashed;
|
||||
public boolean start() {
|
||||
try {
|
||||
System.setProperty("java.rmi.server.hostname", host);
|
||||
registry = LocateRegistry.createRegistry(nPort);
|
||||
|
||||
@@ -73,20 +73,6 @@ public class TCPServer {
|
||||
*/
|
||||
List<ClientHandler> clientHandlers;
|
||||
|
||||
/**
|
||||
* Flag indicating whether the server is recovering from a previous crash.
|
||||
*/
|
||||
boolean serverCrashed;
|
||||
|
||||
/**
|
||||
* Sets whether the server is recovering from a previous crash.
|
||||
*
|
||||
* @param serverCrashed {@code true} if the server is in crash-recovery mode,
|
||||
* {@code false} otherwise.
|
||||
*/
|
||||
public void setServerCrashed(boolean serverCrashed) {
|
||||
this.serverCrashed = serverCrashed;
|
||||
}
|
||||
|
||||
/**
|
||||
* Temporary map associating each username with the corresponding
|
||||
@@ -129,12 +115,8 @@ public class TCPServer {
|
||||
* the connection is handled either as a new player joining the game
|
||||
* or as a reconnection attempt.
|
||||
*
|
||||
* @param serverCrashed {@code true} if the server is being restarted after a crash,
|
||||
* {@code false} otherwise.
|
||||
*/
|
||||
public void start(boolean serverCrashed) {
|
||||
this.serverCrashed = serverCrashed;
|
||||
|
||||
public void start() {
|
||||
try {
|
||||
socketTCP = new ServerSocket(port);
|
||||
heartbeatSocketTCP = new ServerSocket(heartbeatPort);
|
||||
@@ -180,70 +162,64 @@ public class TCPServer {
|
||||
synchronized (controller) {
|
||||
String username = eventAddPlayer.getUsername();
|
||||
//reconnect players after a server crash
|
||||
if (serverCrashed) {
|
||||
if (controller.getModel().getPlayers().stream()
|
||||
.anyMatch(p -> p.getUserName().equals(username))
|
||||
&& !playerList.containsKey(username)) {
|
||||
playerList.put(username, true);
|
||||
System.out.println("(After crash)Reconnected player: " + username);
|
||||
if (playerList.isEmpty()&& controller.getModel()==null) {
|
||||
Game model = new Game(eventAddPlayer.getProposedNPlayer());
|
||||
controller.setModel(model);
|
||||
playerList.setLimit(eventAddPlayer.getProposedNPlayer());
|
||||
System.out.println("Game Created With :"+eventAddPlayer.getProposedNPlayer()+" Players");
|
||||
}
|
||||
|
||||
ClientHandler handler = new ClientHandler(
|
||||
username,
|
||||
clientSocket,
|
||||
clientSend,
|
||||
clientReceive,
|
||||
clientHandlers,
|
||||
playerList,
|
||||
actionQueue
|
||||
);
|
||||
if (controller.addPlayer(username)) {
|
||||
playerList.put(username, true);
|
||||
System.out.println("Accepted player: " + username);
|
||||
|
||||
clientSocket.getOutputStream().write(1);
|
||||
pendingHeartbeat.put(username, handler);
|
||||
ClientHandler handler = new ClientHandler(
|
||||
username,
|
||||
clientSocket,
|
||||
clientSend,
|
||||
clientReceive,
|
||||
clientHandlers,
|
||||
playerList,
|
||||
actionQueue
|
||||
);
|
||||
|
||||
Thread thread = new Thread(handler);
|
||||
thread.start();
|
||||
clientSocket.getOutputStream().write(1);
|
||||
pendingHeartbeat.put(username, handler);
|
||||
|
||||
clientHandlers.add(handler);
|
||||
connectedPlayers++;
|
||||
continue;
|
||||
Thread thread = new Thread(handler);
|
||||
thread.start();
|
||||
|
||||
}
|
||||
clientHandlers.add(handler);
|
||||
connectedPlayers++;
|
||||
continue;
|
||||
|
||||
}
|
||||
//manages a new player adding
|
||||
else {
|
||||
if (playerList.isEmpty()) {
|
||||
Game model = new Game(eventAddPlayer.getProposedNPlayer());
|
||||
controller.setModel(model);
|
||||
playerList.setLimit(eventAddPlayer.getProposedNPlayer());
|
||||
System.out.println("Game Created With :"+eventAddPlayer.getProposedNPlayer()+" Players");
|
||||
}
|
||||
if (controller.getModel().getPlayers().stream()
|
||||
.anyMatch(p -> p.getUserName().equals(username))
|
||||
&& !playerList.containsKey(username)) {
|
||||
playerList.put(username, true);
|
||||
System.out.println("(After crash)Reconnected player: " + username);
|
||||
|
||||
if (controller.addPlayer(username)) {
|
||||
playerList.put(username, true);
|
||||
System.out.println("Accepted player: " + username);
|
||||
ClientHandler handler = new ClientHandler(
|
||||
username,
|
||||
clientSocket,
|
||||
clientSend,
|
||||
clientReceive,
|
||||
clientHandlers,
|
||||
playerList,
|
||||
actionQueue
|
||||
);
|
||||
|
||||
ClientHandler handler = new ClientHandler(
|
||||
username,
|
||||
clientSocket,
|
||||
clientSend,
|
||||
clientReceive,
|
||||
clientHandlers,
|
||||
playerList,
|
||||
actionQueue
|
||||
);
|
||||
clientSocket.getOutputStream().write(1);
|
||||
pendingHeartbeat.put(username, handler);
|
||||
|
||||
clientSocket.getOutputStream().write(1);
|
||||
pendingHeartbeat.put(username, handler);
|
||||
Thread thread = new Thread(handler);
|
||||
thread.start();
|
||||
|
||||
Thread thread = new Thread(handler);
|
||||
thread.start();
|
||||
clientHandlers.add(handler);
|
||||
connectedPlayers++;
|
||||
continue;
|
||||
|
||||
clientHandlers.add(handler);
|
||||
connectedPlayers++;
|
||||
continue;
|
||||
|
||||
}
|
||||
}
|
||||
//reconnect a previously disconnected player
|
||||
if (playerList.containsKey(username)
|
||||
@@ -288,8 +264,6 @@ public class TCPServer {
|
||||
System.out.println("Player could not be added. Connection terminated.");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
} catch (IOException | ClassNotFoundException e) {
|
||||
e.printStackTrace();
|
||||
}
|
||||
|
||||
@@ -186,8 +186,6 @@ public class ServerLauncher {
|
||||
if(!entry.getValue())
|
||||
playerList.remove(entry.getKey());
|
||||
}
|
||||
serverRMI.setServerCrashed(false);
|
||||
serverTCP.setServerCrashed(false);
|
||||
}
|
||||
//notify the event
|
||||
else {
|
||||
@@ -206,13 +204,15 @@ public class ServerLauncher {
|
||||
// removes disconneted players when the game is ended
|
||||
if(event.getEventType().equals(EventType.DISCONNECTED_PLAYER))
|
||||
{
|
||||
playerList.remove(event.getUsername());
|
||||
if(playerList.isEmpty())
|
||||
{
|
||||
gameController.setModel(null);
|
||||
System.out.println("\n!!! Player list is now empty, ready for a new game init !!!\n");
|
||||
synchronized (gameController) {
|
||||
playerList.remove(event.getUsername());
|
||||
if (playerList.isEmpty()) {
|
||||
|
||||
gameController.setModel(null);
|
||||
System.out.println("\n!!! Player list is now empty, ready for a new game init !!!\n");
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
@@ -245,7 +245,6 @@ public class ServerLauncher {
|
||||
BlockingQueue<NetworkEvent> actionQueue = new LinkedBlockingQueue<>();
|
||||
GameController gameController = new GameController();
|
||||
String IP;
|
||||
boolean serverCrashed;
|
||||
try {
|
||||
IP=chooseNetworkInterface(new Scanner(System.in));
|
||||
System.out.println(IP);
|
||||
@@ -266,10 +265,6 @@ public class ServerLauncher {
|
||||
playerList.put(entry.getKey().getUserName(),false);
|
||||
}
|
||||
}
|
||||
serverCrashed = true;
|
||||
|
||||
} else {
|
||||
serverCrashed = false;
|
||||
}
|
||||
playerList.setAction(()->{
|
||||
new Thread(()->{
|
||||
@@ -281,8 +276,6 @@ public class ServerLauncher {
|
||||
}
|
||||
serverRMI.notifyAll(miniModel);
|
||||
serverTCP.notifyAll(miniModel);
|
||||
view = new TUI(miniModel);
|
||||
view.render();
|
||||
}).start();
|
||||
});
|
||||
new Thread(()-> {
|
||||
@@ -295,8 +288,8 @@ public class ServerLauncher {
|
||||
}
|
||||
}).start();
|
||||
|
||||
serverRMI.start(serverCrashed);
|
||||
new Thread(()->{serverTCP.start(serverCrashed);}).start();
|
||||
serverRMI.start();
|
||||
new Thread(()->{serverTCP.start();}).start();
|
||||
System.out.println("Server RMI: "+System.getProperty("java.rmi.server.hostname"));
|
||||
}
|
||||
|
||||
@@ -314,10 +307,6 @@ public class ServerLauncher {
|
||||
while (true) {
|
||||
try{
|
||||
this.doFirstEvent();
|
||||
// if(view!=null)
|
||||
// {
|
||||
// view.fullRender();
|
||||
// }
|
||||
}
|
||||
catch(InterruptedException e){
|
||||
Thread.currentThread().interrupt();
|
||||
|
||||
Reference in New Issue
Block a user