Class 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 Detail

      • LOGGER

        private static final java.util.logging.Logger LOGGER
      • socketChannel

        private final java.nio.channels.SocketChannel socketChannel
      • selectorKey

        private final java.nio.channels.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 java.lang.String incompleteInput
      • incompleteText

        private java.lang.String incompleteText
      • DEFAULT_CHAR_SET

        private static final java.lang.String DEFAULT_CHAR_SET
      • CHARSET_NAME

        private final java.lang.String CHARSET_NAME
      • charset

        private final java.nio.charset.Charset charset
      • encoder

        private final java.nio.charset.CharsetEncoder encoder
      • decoder

        private final java.nio.charset.CharsetDecoder decoder
      • commitPointCounter

        private int commitPointCounter
      • recentlyProcessedLines

        private final java.util.ArrayList<java.lang.String> recentlyProcessedLines
      • newCounter

        private int newCounter
      • bb

        java.nio.ByteBuffer bb
      • encodedMsg

        java.lang.String encodedMsg
      • should

        int should
      • writtenTotal

        int writtenTotal
      • previousRetries

        int previousRetries
      • temporarilyInTrouble

        private long temporarilyInTrouble
      • queue

        java.util.LinkedList<java.lang.String> 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 Detail

      • ClientHandler

        ClientHandler​(Server server,
                      java.nio.channels.SocketChannel channel,
                      java.nio.channels.SelectionKey selKey)
    • Method Detail

      • getSelectorKey

        public java.nio.channels.SelectionKey getSelectorKey()
      • getSocketChannel

        public java.nio.channels.SocketChannel getSocketChannel()
      • isGone

        public boolean isGone()
      • isSpectator

        public boolean isSpectator()
      • didExplicitDisconnect

        public boolean didExplicitDisconnect()
      • setTemporarilyDisconnected

        public void setTemporarilyDisconnected()
      • isTemporarilyDisconnected

        public boolean isTemporarilyDisconnected()
      • 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​(java.nio.ByteBuffer byteBuffer)
      • sendViaChannel

        private void sendViaChannel​(java.lang.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
      • 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
      • canHandleBattleMoveNak

        public boolean canHandleBattleMoveNak()
      • cloneRedoQueue

        public void cloneRedoQueue​(ClientHandler oldCH)
      • initRedoQueueFromStub

        public void initRedoQueueFromStub​(ClientHandlerStub stub)
      • 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​(java.lang.String msg)
      • sendViaChannelRaw

        private void sendViaChannelRaw​(java.lang.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 java.lang.String dumpLastProcessedLines()
      • doCallMethodInTryBlock

        private void doCallMethodInTryBlock​(java.lang.String line,
                                            java.lang.String method,
                                            java.util.List<java.lang.String> li)
      • callMethod

        private void callMethod​(java.lang.String method,
                                java.util.List<java.lang.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​(java.lang.String hexLabel)
      • resolveCreatureType

        private CreatureType resolveCreatureType​(java.lang.String name)
      • resolveCreatureTypeNullOk

        private CreatureType resolveCreatureTypeNullOk​(java.lang.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​(java.lang.String hexLabel)
      • resolveLegion

        private Legion resolveLegion​(java.lang.String markerId)
      • fakeDisconnectClient

        public void fakeDisconnectClient()
      • clearDisconnectClient

        public void clearDisconnectClient()
      • wasFakeDisconnectFlagSet

        public boolean wasFakeDisconnectFlagSet()