de.tud.dvs1.mmpgp2p
Class ServerThread

java.lang.Object
  extended by java.lang.Thread
      extended by de.tud.dvs1.mmpgp2p.MmpgP2PServiceThread
          extended by de.tud.dvs1.mmpgp2p.ServerThread
All Implemented Interfaces:
java.lang.Runnable
Direct Known Subclasses:
ServerImplementation

public abstract class ServerThread
extends MmpgP2PServiceThread

Diese Klasse abstrahiert den Zentralen Server, der die Verwaltung der Benutzeraccounts übernimmt, als Einstiegspunkt für neue Spieler fungiert und die Verteilung der Spheren an Clients übernimmt (Region-Controller). Die Klasse bietet ein HTTP-Interface, über das Status-Informationen abgefragt werden dürfen und Adminstratoren diverse Einstellungen bietet.


Nested Class Summary
 
Nested classes/interfaces inherited from class java.lang.Thread
java.lang.Thread.State, java.lang.Thread.UncaughtExceptionHandler
 
Field Summary
protected  RegionControllerThread initialRC
           
protected static long MAX_WAIT_CLIENT_CONNECT
           
protected static long MAX_WAIT_CLIENT_INACTIVE
           
static java.lang.String PORT
           
protected  java.util.Hashtable regionControllers
           
protected  RegionTree regionTree
           
static java.lang.String SERVER
           
static java.lang.String SERVERNICENAME
           
protected  GameWorldInfo worldInfo
           
 
Fields inherited from class de.tud.dvs1.mmpgp2p.MmpgP2PServiceThread
CR, logSystemStatsInterval, logSystemStatsLast, logSystemStatsStart, logSystemStatsWriter, MAGIC
 
Fields inherited from class java.lang.Thread
MAX_PRIORITY, MIN_PRIORITY, NORM_PRIORITY
 
Constructor Summary
ServerThread()
           
ServerThread(java.util.Properties p)
          Constructor Ein neuer Server-Thread wird erzeugt
 
Method Summary
protected  void closedConnection(ConnectionWorkerThread t)
          Diese Funktion wird aufgerufen, nachem sich ein ConnectionWorkerThread beendet
protected  void doLogSystemStats()
          Statistiken in ein Logfile schreiben
 java.util.Hashtable getActiveClients()
           
protected abstract  Avatar[] getClientAvatars(ClientInfo c)
          Die zu einem Client gehörigen Avatare ermitteln.
 GameWorld getGameWorld()
          Liefere die Spiele-Welt zurück.
static java.lang.String getHeader(java.io.ObjectInputStream in)
          Holt die restlichen Zeilen aus der Verbindung, bis CR kommt
static java.lang.String getHeaderFromInputStreamReader(java.io.InputStreamReader ins)
          Holt die restlichen Zeilen aus der Verbindung, bis CR kommt
 java.lang.String getInfo()
           
protected abstract  GameWorld getInitialGameWorld()
          Die Implementierung muß eine Spielewelt liefern, mit der sich der Server initialisieren kann.
protected abstract  Ruleset getInitialRuleset()
          Mit dieser Methode liefert die Serverklasse die Spielregeln.
 RegionControllerInfo getNextFreeRC()
           
 int getNumConnectionRequests()
           
 Ruleset getRuleset()
           
 ServerThread getServerThread()
           
protected  java.lang.String getShutdownMagic()
           
 ClientRequest incomingConnection(ConnectionWorkerThread t)
          Eine Verbinung kommt herein.
 void incomingData(ConnectionWorkerThread t)
          Verarbeite reinkommende Daten
protected abstract  SessionTicket loginClient(ClientRequest client)
          Ein schon bekannter Client verbindet sich mit dem Server und loggt sich durch einen LOGIN-Befehl ein.
protected  void printSystemStatsFirstLine()
          Intozeile der SystemStats
protected abstract  int registerNewClient(ClientRequest client)
          Verbindet sich ein neuer Client mit dem Befehl REGISTER zum Server, dann wird diese Methode aufgerufen.
 void requestMerge(java.lang.Integer x, java.lang.Integer y)
          Eine Region soll mit einer anderen Region zusammengelegt werden.
 void requestSplit(RegionInfo ri, java.lang.Integer x, java.lang.Integer y)
          Ein RegionController erbittet die Splittung der Region an den vorgeschlagenen Koordinaten.
 void run()
          Thread-Methode
protected abstract  void saveClientAvatars(ClientInfo c, Avatar[] avatars)
          Die zum Client gehörenden Avatare persistent sichern.
protected  void sendShutDown()
           
 void splitRegion(char o, int x, int y)
          Splitten einer Region
 void splitRegion(RegionControllerThread r, int x, int y)
           
 void stopServer()
          Beendet den Server.
 void stopThread()
          Überschreibt die Methode der Abstrakten Vaterklasse.
 
Methods inherited from class de.tud.dvs1.mmpgp2p.MmpgP2PServiceThread
closeServerConnectionWorker, getConnectionWorker, getDebug, getProperties, getProperty, getProperty, getServerConnectionWorker, getSystemLoad, getSystemMemory, getThreadName, getTime, getTraffic, initSystemStats, isRunning, isStarting, log_debug, log_debug, log, log, logSystemStats, openConnection, openServerConnection, readFirstLine, resetSystemStats, setDebug, setProperty, setRunning, waitFor, waitForShutdown
 
Methods inherited from class java.lang.Thread
activeCount, checkAccess, countStackFrames, currentThread, destroy, dumpStack, enumerate, getAllStackTraces, getContextClassLoader, getDefaultUncaughtExceptionHandler, getId, getName, getPriority, getStackTrace, getState, getThreadGroup, getUncaughtExceptionHandler, holdsLock, interrupt, interrupted, isAlive, isDaemon, isInterrupted, join, join, join, resume, setContextClassLoader, setDaemon, setDefaultUncaughtExceptionHandler, setName, setPriority, setUncaughtExceptionHandler, sleep, sleep, start, stop, stop, suspend, toString, yield
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, wait, wait, wait
 

Field Detail

PORT

public static final java.lang.String PORT
See Also:
Constant Field Values

SERVER

public static final java.lang.String SERVER
See Also:
Constant Field Values

SERVERNICENAME

public static final java.lang.String SERVERNICENAME
See Also:
Constant Field Values

MAX_WAIT_CLIENT_CONNECT

protected static final long MAX_WAIT_CLIENT_CONNECT
See Also:
Constant Field Values

MAX_WAIT_CLIENT_INACTIVE

protected static final long MAX_WAIT_CLIENT_INACTIVE
See Also:
Constant Field Values

regionControllers

protected java.util.Hashtable regionControllers

initialRC

protected RegionControllerThread initialRC

worldInfo

protected GameWorldInfo worldInfo

regionTree

protected RegionTree regionTree
Constructor Detail

ServerThread

public ServerThread(java.util.Properties p)
Constructor Ein neuer Server-Thread wird erzeugt

Parameters:
prop - Konfiguration.

ServerThread

public ServerThread()
Method Detail

getActiveClients

public java.util.Hashtable getActiveClients()

getServerThread

public ServerThread getServerThread()

registerNewClient

protected abstract int registerNewClient(ClientRequest client)
Verbindet sich ein neuer Client mit dem Befehl REGISTER zum Server, dann wird diese Methode aufgerufen. Diese Methode legt den neuen Client neu und permanent an, so dass dieser sich zu einem späteren Zeitpunkt einfach durch ein Login authentifizieren kann. Ein Session-Ticket wird automatisch an den Client ausgeliefert und die Region-Controller des Clients informiert.

Parameters:
client - Enthält alle Informationen, die vom Client geliefert wurden.
Returns:
0, falls der Client angelegt werden konnte. Ansonsten einen entsprechenden Fehlercode.

loginClient

protected abstract SessionTicket loginClient(ClientRequest client)
Ein schon bekannter Client verbindet sich mit dem Server und loggt sich durch einen LOGIN-Befehl ein.

Parameters:
client - Enthält alle Informationen, die vom Client geliefert wurden.
Returns:
Ein SessionTicket, das bereits von der aufrufenden Instanz an den Client und an die RegionController ausgeliefert worden ist.

getClientAvatars

protected abstract Avatar[] getClientAvatars(ClientInfo c)
Die zu einem Client gehörigen Avatare ermitteln. Diese werden dann an den zuständigen RC ausgeliefert und von dort an den Client übermittelt und zur Steuerung durch den Spieler über seinen Client frei gegeben.

Parameters:
c - Enthält alle Informationen, die vom Client geliefert wurden.
Returns:
Einen Array von Avataren, die alle vom Client/Spieler steuerbaren Avatare darstellen.

saveClientAvatars

protected abstract void saveClientAvatars(ClientInfo c,
                                          Avatar[] avatars)
Die zum Client gehörenden Avatare persistent sichern. Diese Methode wird dann angewandt, wenn sich ein Client ausloggt und der zugehörige RC die Avatare des Clients zum Sichern übermittelt.

Parameters:
c - Enthält alle Informationen, die den Client identifizieren.
avatars - Die Avatare des Clients

getInitialGameWorld

protected abstract GameWorld getInitialGameWorld()
Die Implementierung muß eine Spielewelt liefern, mit der sich der Server initialisieren kann.


getInitialRuleset

protected abstract Ruleset getInitialRuleset()
Mit dieser Methode liefert die Serverklasse die Spielregeln. Die Methode wird gebraucht, um den RCs und den Clients die aktuellen Spielregeln auszuliefern. Die Implementierung muß eine eigene Klasse Ruleset implementieren, diese hier instanzieren und zurückliefern.


getRuleset

public Ruleset getRuleset()

requestMerge

public void requestMerge(java.lang.Integer x,
                         java.lang.Integer y)
                  throws MmpgP2PException
Eine Region soll mit einer anderen Region zusammengelegt werden. Der Server muß nun diesen Befehl "absegnen" und an alle RCs der beteiligten Pools übertragen.

Throws:
MmpgP2PException

requestSplit

public void requestSplit(RegionInfo ri,
                         java.lang.Integer x,
                         java.lang.Integer y)
                  throws MmpgP2PException
Ein RegionController erbittet die Splittung der Region an den vorgeschlagenen Koordinaten. Der Server muß nun diesen Befehl "absegnen" und an alle RCs des Pools übertragen.

Throws:
MmpgP2PException

splitRegion

public void splitRegion(char o,
                        int x,
                        int y)
                 throws MmpgP2PException
Splitten einer Region

Throws:
MmpgP2PException

splitRegion

public void splitRegion(RegionControllerThread r,
                        int x,
                        int y)
                 throws MmpgP2PException
Throws:
MmpgP2PException

getNextFreeRC

public RegionControllerInfo getNextFreeRC()

run

public void run()
Thread-Methode

Specified by:
run in interface java.lang.Runnable
Overrides:
run in class java.lang.Thread

getGameWorld

public GameWorld getGameWorld()
Liefere die Spiele-Welt zurück.


printSystemStatsFirstLine

protected void printSystemStatsFirstLine()
                                  throws java.io.IOException
Intozeile der SystemStats

Overrides:
printSystemStatsFirstLine in class MmpgP2PServiceThread
Throws:
java.io.IOException

doLogSystemStats

protected void doLogSystemStats()
Statistiken in ein Logfile schreiben

Overrides:
doLogSystemStats in class MmpgP2PServiceThread

incomingConnection

public ClientRequest incomingConnection(ConnectionWorkerThread t)
Eine Verbinung kommt herein.

Specified by:
incomingConnection in class MmpgP2PServiceThread
Returns:
Ein ClientRequest wird erzeugt, über den die Verbindung identifiziert wird.

closedConnection

protected void closedConnection(ConnectionWorkerThread t)
Description copied from class: MmpgP2PServiceThread
Diese Funktion wird aufgerufen, nachem sich ein ConnectionWorkerThread beendet

Specified by:
closedConnection in class MmpgP2PServiceThread

incomingData

public void incomingData(ConnectionWorkerThread t)
Verarbeite reinkommende Daten

Specified by:
incomingData in class MmpgP2PServiceThread
Parameters:
s - Der Socket, dessen Daten verarbeitet werden sollen.

stopServer

public void stopServer()
                throws java.io.IOException
Beendet den Server.

Sorgt dafür, dass alle Clients über den Abbruch informiert werden, fordert die RegionController zum Backup der Daten auf und macht die Spielwelt consistent.

Throws:
java.io.IOException

sendShutDown

protected void sendShutDown()

stopThread

public void stopThread()
Überschreibt die Methode der Abstrakten Vaterklasse. Vor dem eigentlichen runterfahren wird noch etwas aufgeräumt.

Overrides:
stopThread in class MmpgP2PServiceThread

getInfo

public java.lang.String getInfo()

getHeader

public static java.lang.String getHeader(java.io.ObjectInputStream in)
Holt die restlichen Zeilen aus der Verbindung, bis CR kommt


getHeaderFromInputStreamReader

public static java.lang.String getHeaderFromInputStreamReader(java.io.InputStreamReader ins)
Holt die restlichen Zeilen aus der Verbindung, bis CR kommt


getShutdownMagic

protected java.lang.String getShutdownMagic()

getNumConnectionRequests

public int getNumConnectionRequests()