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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user