net.sf.colossus.webserver
Class WebServerClientSocketThread

java.lang.Object
  extended by java.lang.Thread
      extended by net.sf.colossus.webserver.WebServerClientSocketThread
All Implemented Interfaces:
java.lang.Runnable, IWebClient

public class WebServerClientSocketThread
extends java.lang.Thread
implements IWebClient

Thread to handle one user client connection at the webserver Reads always one line from the socket, parses it and executes the corresponding action. This class also provides the methods which the server calls on the client (=translates method calls to sending them as text messages over the socket).

Author:
Clemens Katzer

Nested Class Summary
 
Nested classes/interfaces inherited from class java.lang.Thread
java.lang.Thread.State, java.lang.Thread.UncaughtExceptionHandler
 
Field Summary
private  int clientVersion
           
private  boolean done
           
private static int IDLE_WARNING_INTERVAL_MINUTES
           
private static int IDLE_WARNING_MAXCOUNT
           
private  int idleWarningsSent
           
private  java.io.BufferedReader in
           
private  java.io.InputStream is
           
private  long lastPacketReceived
           
private  boolean loggedIn
           
private static java.util.logging.Logger LOGGER
           
private  java.io.PrintWriter out
           
private static int PING_MAX_TRIES
           
private static long PING_REQUEST_INTERVAL_SECONDS
           
private  int pingsTried
           
private static java.lang.String sep
           
private  WebServer server
           
private  java.net.Socket socket
           
private  java.lang.Thread stopper
           
private  java.lang.String unverifiedUsername
           
private  User user
           
 
Fields inherited from class java.lang.Thread
MAX_PRIORITY, MIN_PRIORITY, NORM_PRIORITY
 
Fields inherited from interface net.sf.colossus.webcommon.IWebClient
alreadyLoggedIn, chatDeliver, connectionClosed, didEnroll, didUnenroll, forcedLogout, gameCancelled, gameInfo, gameStarted, gameStartsNow, gameStartsSoon, generalMessage, grantAdmin, pingRequest, requestAttention, tooManyUsers, userInfo
 
Constructor Summary
WebServerClientSocketThread(WebServer server, java.net.Socket socket)
           
 
Method Summary
 void chatDeliver(java.lang.String chatId, long when, java.lang.String sender, java.lang.String message, boolean resent)
           
 void checkMaxIdleTime(long now)
          Currently this will log out only older clients, because they do not respond to the ping packets.
 void connectionReset(boolean forcedLogout)
           
 void deliverGeneralMessage(long when, boolean error, java.lang.String title, java.lang.String message)
           
 void didEnroll(java.lang.String gameId, java.lang.String username)
           
 void didUnenroll(java.lang.String gameId, java.lang.String username)
           
protected  void forceLogout(WebServerClientSocketThread other)
           
 void gameCancelled(java.lang.String gameId, java.lang.String byUser)
           
 void gameInfo(GameInfo gi)
           
 void gameStartsNow(java.lang.String gameId, int port, java.lang.String hostingHost)
           
 void gameStartsSoon(java.lang.String gameId, java.lang.String byUser)
           
 int getClientVersion()
           
(package private)  User getUser()
           
private  java.lang.String getUsername()
           
 void grantAdminStatus()
           
 void interrupt()
           
private  boolean parseLine(java.lang.String fromClient)
           
static void reject(java.net.Socket socket)
           
 void requestAttention(long when, java.lang.String byUser, boolean byAdmin, java.lang.String message, int beepCount, long beepInterval, boolean windows)
           
 void requestPing(java.lang.String arg1, java.lang.String arg2, java.lang.String arg3)
           
 void requestPingIfNeeded(long now)
           
 void run()
          prepare socket to read/write, and then loop as long as lines from client come, and parse them
private  void sendToClient(java.lang.String s)
           
 void tellToTerminate()
           
 void userInfo(int loggedin, int enrolled, int playing, int dead, long ago, java.lang.String text)
           
 
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, 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

LOGGER

private static final java.util.logging.Logger LOGGER

server

private WebServer server

socket

private java.net.Socket socket

is

private java.io.InputStream is

in

private java.io.BufferedReader in

out

private java.io.PrintWriter out

user

private User user

clientVersion

private int clientVersion

lastPacketReceived

private long lastPacketReceived

pingsTried

private int pingsTried

idleWarningsSent

private int idleWarningsSent

loggedIn

private boolean loggedIn

sep

private static final java.lang.String sep
See Also:
Constant Field Values

stopper

private java.lang.Thread stopper

PING_REQUEST_INTERVAL_SECONDS

private static final long PING_REQUEST_INTERVAL_SECONDS
See Also:
Constant Field Values

PING_MAX_TRIES

private static final int PING_MAX_TRIES
See Also:
Constant Field Values

IDLE_WARNING_INTERVAL_MINUTES

private static final int IDLE_WARNING_INTERVAL_MINUTES
See Also:
Constant Field Values

IDLE_WARNING_MAXCOUNT

private static final int IDLE_WARNING_MAXCOUNT
See Also:
Constant Field Values

unverifiedUsername

private java.lang.String unverifiedUsername

done

private boolean done
Constructor Detail

WebServerClientSocketThread

public WebServerClientSocketThread(WebServer server,
                                   java.net.Socket socket)
Method Detail

reject

public static void reject(java.net.Socket socket)

getUser

User getUser()

getUsername

private java.lang.String getUsername()

getClientVersion

public int getClientVersion()
Specified by:
getClientVersion in interface IWebClient

requestPingIfNeeded

public void requestPingIfNeeded(long now)

checkMaxIdleTime

public void checkMaxIdleTime(long now)
Currently this will log out only older clients, because they do not respond to the ping packets. TODO in future, distinct between ping packets and all other activities, and log out user which hasn't done anything and left WebClient standing around idle for very long.

Parameters:
now -

tellToTerminate

public void tellToTerminate()

interrupt

public void interrupt()
Overrides:
interrupt in class java.lang.Thread

run

public void run()
prepare socket to read/write, and then loop as long as lines from client come, and parse them

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

parseLine

private boolean parseLine(java.lang.String fromClient)

forceLogout

protected void forceLogout(WebServerClientSocketThread other)

sendToClient

private void sendToClient(java.lang.String s)

grantAdminStatus

public void grantAdminStatus()
Specified by:
grantAdminStatus in interface IWebClient

didEnroll

public void didEnroll(java.lang.String gameId,
                      java.lang.String username)
Specified by:
didEnroll in interface IWebClient

didUnenroll

public void didUnenroll(java.lang.String gameId,
                        java.lang.String username)
Specified by:
didUnenroll in interface IWebClient

gameCancelled

public void gameCancelled(java.lang.String gameId,
                          java.lang.String byUser)
Specified by:
gameCancelled in interface IWebClient

userInfo

public void userInfo(int loggedin,
                     int enrolled,
                     int playing,
                     int dead,
                     long ago,
                     java.lang.String text)
Specified by:
userInfo in interface IWebClient

gameInfo

public void gameInfo(GameInfo gi)
Specified by:
gameInfo in interface IWebClient

gameStartsSoon

public void gameStartsSoon(java.lang.String gameId,
                           java.lang.String byUser)
Specified by:
gameStartsSoon in interface IWebClient

gameStartsNow

public void gameStartsNow(java.lang.String gameId,
                          int port,
                          java.lang.String hostingHost)
Specified by:
gameStartsNow in interface IWebClient

chatDeliver

public void chatDeliver(java.lang.String chatId,
                        long when,
                        java.lang.String sender,
                        java.lang.String message,
                        boolean resent)
Specified by:
chatDeliver in interface IWebClient

deliverGeneralMessage

public void deliverGeneralMessage(long when,
                                  boolean error,
                                  java.lang.String title,
                                  java.lang.String message)
Specified by:
deliverGeneralMessage in interface IWebClient

requestAttention

public void requestAttention(long when,
                             java.lang.String byUser,
                             boolean byAdmin,
                             java.lang.String message,
                             int beepCount,
                             long beepInterval,
                             boolean windows)
Specified by:
requestAttention in interface IWebClient

requestPing

public void requestPing(java.lang.String arg1,
                        java.lang.String arg2,
                        java.lang.String arg3)

connectionReset

public void connectionReset(boolean forcedLogout)
Specified by:
connectionReset in interface IWebClient