fixed client/server ping + added server console

This commit is contained in:
BetaSteward 2011-05-14 23:28:07 -04:00
parent 0b1527a206
commit 473f6bcad9
38 changed files with 2657 additions and 63 deletions

View file

@ -28,7 +28,6 @@
package mage.server;
import java.net.UnknownHostException;
import mage.server.util.PluginClassLoader;
import java.io.File;
import java.io.FilenameFilter;
@ -60,6 +59,7 @@ public class Main {
private static Logger logger = Logger.getLogger(Main.class);
private final static String testModeArg = "-testMode=";
private final static String adminPasswordArg = "-adminPassword=";
private final static String pluginFolder = "plugins";
private static MageVersion version = new MageVersion(0, 7, 2);
@ -88,14 +88,18 @@ public class Main {
DeckValidatorFactory.getInstance().addDeckType(plugin.getName(), loadPlugin(plugin));
}
boolean testMode = false;
String adminPassword = "";
for (String arg: args) {
if (arg.startsWith(testModeArg)) {
testMode = Boolean.valueOf(arg.replace(testModeArg, ""));
}
else if (arg.startsWith(adminPasswordArg)) {
adminPassword = arg.replace(adminPasswordArg, "");
}
}
Copier.setLoader(classLoader);
setServerAddress(config.getServerAddress());
server = new ServerImpl(config.getPort(), config.getServerName(), testMode);
server = new ServerImpl(config.getPort(), config.getServerName(), testMode, adminPassword);
}

View file

@ -62,6 +62,7 @@ import mage.view.DraftPickView;
import mage.view.GameView;
import mage.view.TableView;
import mage.view.TournamentView;
import mage.view.UserView;
import org.apache.log4j.Logger;
/**
@ -74,14 +75,16 @@ public class ServerImpl extends RemoteServer implements Server {
private static ExecutorService rmiExecutor = ThreadExecutor.getInstance().getRMIExecutor();
private boolean testMode;
private String password;
public ServerImpl(int port, String name, boolean testMode) {
public ServerImpl(int port, String name, boolean testMode, String password) {
try {
System.setSecurityManager(null);
Registry reg = LocateRegistry.createRegistry(port);
Server stub = (Server) UnicastRemoteObject.exportObject(this, port);
reg.rebind(name, stub);
this.testMode = testMode;
this.password = password;
logger.info("Started MAGE server - listening on port " + port);
if (testMode)
logger.info("MAGE server running in test mode");
@ -106,6 +109,16 @@ public class ServerImpl extends RemoteServer implements Server {
SessionManager.getInstance().getSession(sessionId).ack(message);
}
@Override
public boolean ping(UUID sessionId) {
Session session = SessionManager.getInstance().getSession(sessionId);
if (session != null) {
session.ping();
return true;
}
return false;
}
@Override
public UUID registerClient(String userName, UUID clientId, MageVersion version) throws MageException, RemoteException {
@ -113,7 +126,7 @@ public class ServerImpl extends RemoteServer implements Server {
try {
if (version.compareTo(Main.getVersion()) != 0)
throw new MageException("Wrong client version " + version + ", expecting version " + Main.getVersion());
sessionId = SessionManager.getInstance().createSession(userName, clientId);
sessionId = SessionManager.getInstance().createSession(userName, getClientHost(), clientId);
logger.info("User " + userName + " connected from " + getClientHost());
} catch (Exception ex) {
handleException(ex);
@ -121,6 +134,22 @@ public class ServerImpl extends RemoteServer implements Server {
return sessionId;
}
@Override
public UUID registerAdmin(String password, MageVersion version) throws RemoteException, MageException {
UUID sessionId = null;
try {
if (version.compareTo(Main.getVersion()) != 0)
throw new MageException("Wrong client version " + version + ", expecting version " + Main.getVersion());
if (!password.equals(this.password))
throw new MageException("Wrong password");
sessionId = SessionManager.getInstance().createSession(getClientHost());
logger.info("Admin connected from " + getClientHost());
} catch (Exception ex) {
handleException(ex);
}
return sessionId;
}
@Override
public TableView createTable(UUID sessionId, UUID roomId, MatchOptions options) throws MageException {
@ -236,7 +265,6 @@ public class ServerImpl extends RemoteServer implements Server {
return null;
}
@Override
public TableView getTable(UUID roomId, UUID tableId) throws MageException {
try {
@ -258,8 +286,8 @@ public class ServerImpl extends RemoteServer implements Server {
Session session = SessionManager.getInstance().getSession(sessionId);
if (session != null) {
session.kill();
logger.info("Client deregistered ...");
}
logger.info("Client deregistered ...");
}
}
);
@ -812,4 +840,9 @@ public class ServerImpl extends RemoteServer implements Server {
return GameManager.getInstance().getGameView(gameId, sessionId, playerId);
}
@Override
public List<UserView> getUsers(UUID sessionId) throws RemoteException, MageException {
return SessionManager.getInstance().getUsers(sessionId);
}
}

View file

@ -28,7 +28,7 @@
package mage.server;
import java.util.logging.Level;
import java.util.Date;
import java.util.UUID;
import mage.cards.decks.Deck;
import mage.interfaces.callback.CallbackServerSession;
@ -48,14 +48,31 @@ public class Session {
private UUID sessionId;
private UUID clientId;
private String username;
private String host;
private int messageId = 0;
private String ackMessage;
private Date timeConnected;
private long lastPing;
private boolean isAdmin = false;
private final CallbackServerSession callback = new CallbackServerSession();
public Session(String userName, UUID clientId) {
public Session(String userName, String host, UUID clientId) {
sessionId = UUID.randomUUID();
this.username = userName;
this.host = host;
this.clientId = clientId;
this.isAdmin = false;
this.timeConnected = new Date();
ping();
}
public Session(String host) {
sessionId = UUID.randomUUID();
this.username = "Admin";
this.host = host;
this.isAdmin = true;
this.timeConnected = new Date();
ping();
}
public UUID getId() {
@ -137,4 +154,25 @@ public class Session {
return username;
}
public void ping() {
this.lastPing = System.currentTimeMillis();
if (logger.isTraceEnabled())
logger.trace("Ping received from" + username + ":" + sessionId);
}
public boolean stillAlive() {
return (System.currentTimeMillis() - lastPing) < 60000;
}
public boolean isAdmin() {
return isAdmin;
}
public String getHost() {
return host;
}
public Date getConnectionTime() {
return timeConnected;
}
}

View file

@ -28,12 +28,17 @@
package mage.server;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.UUID;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.TimeUnit;
import mage.interfaces.MageException;
import mage.view.UserView;
import org.apache.log4j.Logger;
/**
@ -44,11 +49,17 @@ public class SessionManager {
private final static Logger logger = Logger.getLogger(SessionManager.class);
private final static SessionManager INSTANCE = new SessionManager();
private static ScheduledExecutorService sessionExecutor;
public static SessionManager getInstance() {
return INSTANCE;
}
protected SessionManager() {
sessionExecutor = Executors.newScheduledThreadPool(1);
sessionExecutor.scheduleWithFixedDelay(new SessionChecker(), 30, 10, TimeUnit.SECONDS);
}
private ConcurrentHashMap<UUID, Session> sessions = new ConcurrentHashMap<UUID, Session>();
public Session getSession(UUID sessionId) {
@ -56,7 +67,7 @@ public class SessionManager {
return sessions.get(sessionId);
}
public UUID createSession(String userName, UUID clientId) throws MageException {
public UUID createSession(String userName, String host, UUID clientId) throws MageException {
for (Session session: sessions.values()) {
if (session.getUsername().equals(userName)) {
if (session.getClientId().equals(clientId)) {
@ -68,16 +79,32 @@ public class SessionManager {
}
}
}
Session session = new Session(userName, clientId);
Session session = new Session(userName, host, clientId);
sessions.put(session.getId(), session);
logger.info("Session " + session.getId() + " created for user " + userName);
return session.getId();
}
public UUID createSession(String host) throws MageException {
Session session = new Session(host);
sessions.put(session.getId(), session);
logger.info("Admin session created");
return session.getId();
}
public void removeSession(UUID sessionId) {
sessions.remove(sessionId);
}
public void checkSessions() {
for (Session session: sessions.values()) {
if (!session.stillAlive()) {
logger.info("Client for user " + session.getUsername() + ":" + session.getId() + " timed out - releasing resources");
session.kill();
}
}
}
public Map<UUID, Session> getSessions() {
Map<UUID, Session> map = new HashMap<UUID, Session>();
for (Map.Entry<UUID, Session> entry : sessions.entrySet()) {
@ -85,4 +112,25 @@ public class SessionManager {
}
return map;
}
List<UserView> getUsers(UUID sessionId) {
List<UserView> users = new ArrayList<UserView>();
Session admin = sessions.get(sessionId);
if (admin != null && admin.isAdmin()) {
for (Session session: sessions.values()) {
users.add(new UserView(session.getUsername(), session.getHost(), session.getId(), session.getConnectionTime()));
}
}
return users;
}
class SessionChecker implements Runnable {
@Override
public void run() {
checkSessions();
}
}
}