Class ClientHandler

java.lang.Object
net.sf.colossus.server.ClientHandlerStub
net.sf.colossus.server.ClientHandler
All Implemented Interfaces:
IClient

final class ClientHandler extends ClientHandlerStub implements IClient
Holds all data specific to one client connection. (Earlier this was the class ServerSocketThread, but since changing to NIO it's not an own thread any more.) The code in here is (should be) executed exclusively by the server thread as reaction to something happening on the selector - first the client connection being accepted, and then later always when data from client was received (usually from THIS client, but there might be other cases).
Author:
David Ripton
  • Field Details

    • LOGGER

      private static final Logger LOGGER
    • socketChannel

      private final SocketChannel socketChannel
    • selectorKey

      private final SelectionKey selectorKey
    • clientVersion

      private int clientVersion
    • spectator

      private boolean spectator
    • didExplicitDisconnect

      private boolean didExplicitDisconnect
    • withdrawnAlready

      private boolean withdrawnAlready
    • cantSendMessageRepeated

      private int cantSendMessageRepeated
    • temporarilyDisconnected

      private boolean temporarilyDisconnected
    • obsolete

      private boolean obsolete
    • incompleteInput

      private String incompleteInput
    • incompleteText

      private String incompleteText
    • DEFAULT_CHAR_SET

      private static final String DEFAULT_CHAR_SET
    • CHARSET_NAME

      private final String CHARSET_NAME
    • charset

      private final Charset charset
    • encoder

      private final CharsetEncoder encoder
    • decoder

      private final CharsetDecoder decoder
    • commitPointCounter

      private int commitPointCounter
    • MAX_KEEP_LINES

      private static final int MAX_KEEP_LINES
      See Also:
    • recentlyProcessedLines

      private final ArrayList<String> recentlyProcessedLines
    • newCounter

      private int newCounter
    • bb

    • encodedMsg

      String encodedMsg
    • should

      int should
    • writtenTotal

      int writtenTotal
    • previousRetries

      int previousRetries
    • temporarilyInTrouble

      private long temporarilyInTrouble
    • queue

      The queue in which messages are stored, until they were really written. Usually empty; stuff piles up only when writing to socket fails, e.g. network or client too slow.
    • fakeDisconnect

      public boolean fakeDisconnect
      Debug stuff, only for testing/development purposes
  • Constructor Details

  • Method Details

    • getSelectorKey

      public SelectionKey getSelectorKey()
    • getSocketChannel

      public SocketChannel getSocketChannel()
    • isGone

      public boolean isGone()
    • isStub

      protected boolean isStub()
      Overrides:
      isStub in class ClientHandlerStub
    • isSpectator

      public boolean isSpectator()
    • didExplicitDisconnect

      public boolean didExplicitDisconnect()
    • setTemporarilyDisconnected

      public void setTemporarilyDisconnected()
    • isTemporarilyDisconnected

      public boolean isTemporarilyDisconnected()
    • canHandlePingRequest

      protected boolean canHandlePingRequest()
      Overrides:
      canHandlePingRequest in class ClientHandlerStub
    • canHandleNewVariantXML

      protected boolean canHandleNewVariantXML()
    • disposeClient

      public void disposeClient()
      Server side disposes a client (and informs it about it first) To be used only for "disposeAllClients()", otherwise setIsGone reason is misleading.
      Specified by:
      disposeClient in interface IClient
      Overrides:
      disposeClient in class ClientHandlerStub
    • processInput

      public void processInput(ByteBuffer byteBuffer)
    • sendViaChannel

      private void sendViaChannel(String msg)
    • flushQueuedContent

      protected void flushQueuedContent()
      Description copied from class: ClientHandlerStub
      Selector reported that client became writable again (after a prior write attempt had not written all bytes). Now start/try writing the message(s) which are still in the queue.
      Overrides:
      flushQueuedContent in class ClientHandlerStub
    • enqueueToRedoQueue

      protected void enqueueToRedoQueue(int messageNr, String message)
      Overrides:
      enqueueToRedoQueue in class ClientHandlerStub
    • commitPoint

      protected void commitPoint()
      Overrides:
      commitPoint in class ClientHandlerStub
    • confirmCommitPoint

      private void confirmCommitPoint(int confirmedNr)
      Remove the messages in redoQueue prior to given commit point
      Parameters:
      confirmedNr - Commit point from which we now know that client has successfully received it
    • supportsReconnect

      public boolean supportsReconnect()
      Overrides:
      supportsReconnect in class ClientHandlerStub
    • canHandleBattleMoveNak

      public boolean canHandleBattleMoveNak()
    • canHandleAdvancedSync

      public boolean canHandleAdvancedSync()
      Overrides:
      canHandleAdvancedSync in class ClientHandlerStub
    • cloneRedoQueue

      public void cloneRedoQueue(ClientHandler oldCH)
    • initRedoQueueFromStub

      public void initRedoQueueFromStub(ClientHandlerStub stub)
    • reEnqueue

      private void reEnqueue(MessageForClient mfc)
    • syncAfterReconnect

      public void syncAfterReconnect(int lastReceivedMessageNr, int syncRequestNumber)
      Re-send all data after the message from which we know client got it
      Parameters:
      lastReceivedMessageNr - Last message which client did still receive
      syncRequestNumber - Every request has own unique id, so we don't mix them
    • isTemporarilyInTrouble

      public boolean isTemporarilyInTrouble()
    • howLongAlreadyInTrouble

      public long howLongAlreadyInTrouble()
    • setTemporarilyInTrouble

      private void setTemporarilyInTrouble()
    • clearTemporarilyInTrouble

      public void clearTemporarilyInTrouble()
    • handleEncoding

      private void handleEncoding(String msg)
    • sendViaChannelRaw

      private void sendViaChannelRaw(String msg)
    • attemptWritingToChannel

      private void attemptWritingToChannel()
    • withdrawIfNeeded

      private void withdrawIfNeeded(boolean explicit)
      Make sure player is withdrawn from game. Explicit if via Withdraw message from client, implicit because of disconnect message or connection problems. This is just a wrapper for the both situations where for !withdrawnAlready should be checked
      Parameters:
      explicit - Whether client has requested withdraw explicitly
    • declareObsolete

      public void declareObsolete()
    • dumpLastProcessedLines

      public String dumpLastProcessedLines()
    • doCallMethodInTryBlock

      private void doCallMethodInTryBlock(String line, String method, List<String> li)
    • callMethod

      private void callMethod(String method, List<String> args)
      This is the longish if-elseif-else block which deserialized all client-to-server calls back from String to actual methodCalls.
      Parameters:
      method - The method to execute
      args - A list of argument Strings
    • resolveBattleHex

      private BattleHex resolveBattleHex(String hexLabel)
    • resolveCreatureType

      private CreatureType resolveCreatureType(String name)
    • resolveCreatureTypeNullOk

      private CreatureType resolveCreatureTypeNullOk(String name)
      There are cases where "null" comes over network and is not meant to be resolved to a CreatureType, namely: teleportingLord if no teleport; null recruiter; decline Acquire. TODO What to do with the "Anything"?
      Parameters:
      name - Name of the creatureType to find, might be "null"
      Returns:
      CreatureType for that name, or null if name is "null"
    • resolveMasterHex

      private MasterHex resolveMasterHex(String hexLabel)
    • resolveLegion

      private Legion resolveLegion(String markerId)
    • sendToClient

      protected void sendToClient(String message)
      Overrides:
      sendToClient in class ClientHandlerStub
    • fakeDisconnectClient

      public void fakeDisconnectClient()
    • clearDisconnectClient

      public void clearDisconnectClient()
    • wasFakeDisconnectFlagSet

      public boolean wasFakeDisconnectFlagSet()