Package net.sf.colossus.server
Class ClientHandler
java.lang.Object
net.sf.colossus.server.ClientHandlerStub
net.sf.colossus.server.ClientHandler
- All Implemented Interfaces:
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 Summary
FieldsModifier and TypeFieldDescription(package private) ByteBuffer
private int
private final Charset
private final String
private int
private int
private final CharsetDecoder
private static final String
private boolean
(package private) String
private final CharsetEncoder
boolean
Debug stuff, only for testing/development purposesprivate String
private String
private static final Logger
private static final int
private int
private boolean
(package private) int
(package private) LinkedList
<String> The queue in which messages are stored, until they were really written.private final SelectionKey
(package private) int
private final SocketChannel
private boolean
private boolean
private long
private boolean
(package private) int
Fields inherited from class net.sf.colossus.server.ClientHandlerStub
counter, isCommitPoint, isGone, messageCounter, playerName, redoQueue, sep, server, signonName
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionprivate void
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.boolean
boolean
protected boolean
protected boolean
void
void
void
cloneRedoQueue
(ClientHandler oldCH) protected void
private void
confirmCommitPoint
(int confirmedNr) Remove the messages in redoQueue prior to given commit pointvoid
boolean
void
Server side disposes a client (and informs it about it first) To be used only for "disposeAllClients()", otherwise setIsGone reason is misleading.private void
doCallMethodInTryBlock
(String line, String method, List<String> li) protected void
enqueueToRedoQueue
(int messageNr, String message) void
protected void
Selector reported that client became writable again (after a prior write attempt had not written all bytes).private void
handleEncoding
(String msg) long
void
boolean
isGone()
boolean
protected boolean
isStub()
boolean
boolean
void
processInput
(ByteBuffer byteBuffer) private void
private BattleHex
resolveBattleHex
(String hexLabel) private CreatureType
resolveCreatureType
(String name) private CreatureType
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.private Legion
resolveLegion
(String markerId) private MasterHex
resolveMasterHex
(String hexLabel) protected void
sendToClient
(String message) private void
sendViaChannel
(String msg) private void
sendViaChannelRaw
(String msg) void
private void
boolean
void
syncAfterReconnect
(int lastReceivedMessageNr, int syncRequestNumber) Re-send all data after the message from which we know client got itboolean
private void
withdrawIfNeeded
(boolean explicit) Make sure player is withdrawn from game.Methods inherited from class net.sf.colossus.server.ClientHandlerStub
addCreature, appendToConnectionLog, askAcquireAngel, askChooseStrikePenalty, askConcede, askFlee, askNegotiate, askPickColor, askPickFirstMarker, cleanupBattle, confirmWhenCaughtUp, createSummonAngel, didMove, didRecruit, didSplit, didSummon, doReinforce, getClientName, getPlayerName, getSignonName, initBattle, initBoard, kickPhase, log, messageFromServer, nak, nextEngagement, pingRequest, placeNewChit, removeCreature, removeDeadBattleChits, removeLegion, revealCreatures, revealEngagedCreatures, serverConfirmsConnection, setBoardActive, setColor, setIsGone, setLegionStatus, setPlayerName, setupBattleFight, setupBattleMove, setupBattleRecruit, setupBattleSummon, setupFight, setupMove, setupMuster, setupSplit, setupTurnState, syncOption, tellBattleMove, tellEngagement, tellEngagementResults, tellGameOver, tellInitialGameInfo, tellLegionLocation, tellMovementRoll, tellPlayerElim, tellProposal, tellRedo, tellReplay, tellSlowResults, tellStrikeResults, tellSyncCompleted, tellWhatsHappening, undidMove, undidRecruit, undidSplit, updateCreatureCount, updateOnePlayersInfo, updatePlayerInfo
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
Methods inherited from interface net.sf.colossus.client.IClient
addCreature, appendToConnectionLog, askAcquireAngel, askChooseStrikePenalty, askConcede, askFlee, askNegotiate, askPickColor, askPickFirstMarker, cleanupBattle, confirmWhenCaughtUp, createSummonAngel, didMove, didRecruit, didSplit, didSummon, doReinforce, initBattle, initBoard, kickPhase, log, messageFromServer, nak, nextEngagement, pingRequest, placeNewChit, removeCreature, removeDeadBattleChits, removeLegion, revealCreatures, revealEngagedCreatures, serverConfirmsConnection, setBoardActive, setColor, setLegionStatus, setPlayerName, setupBattleFight, setupBattleMove, setupBattleRecruit, setupBattleSummon, setupFight, setupMove, setupMuster, setupSplit, setupTurnState, syncOption, tellBattleMove, tellEngagement, tellEngagementResults, tellGameOver, tellLegionLocation, tellMovementRoll, tellPlayerElim, tellProposal, tellRedo, tellReplay, tellSlowResults, tellStrikeResults, tellSyncCompleted, tellWhatsHappening, undidMove, undidRecruit, undidSplit, updateCreatureCount, updateOnePlayersInfo, updatePlayerInfo
-
Field Details
-
LOGGER
-
socketChannel
-
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
-
incompleteText
-
DEFAULT_CHAR_SET
-
CHARSET_NAME
-
charset
-
encoder
-
decoder
-
commitPointCounter
private int commitPointCounter -
MAX_KEEP_LINES
private static final int MAX_KEEP_LINES- See Also:
-
recentlyProcessedLines
-
newCounter
private int newCounter -
bb
ByteBuffer bb -
encodedMsg
String encodedMsg -
should
int should -
writtenTotal
int writtenTotal -
previousRetries
int previousRetries -
temporarilyInTrouble
private long temporarilyInTrouble -
queue
LinkedList<String> queueThe 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 fakeDisconnectDebug stuff, only for testing/development purposes
-
-
Constructor Details
-
ClientHandler
ClientHandler(Server server, SocketChannel channel, SelectionKey selKey)
-
-
Method Details
-
getSelectorKey
-
getSocketChannel
-
isGone
public boolean isGone() -
isStub
protected boolean isStub()- Overrides:
isStub
in classClientHandlerStub
-
isSpectator
public boolean isSpectator() -
didExplicitDisconnect
public boolean didExplicitDisconnect() -
setTemporarilyDisconnected
public void setTemporarilyDisconnected() -
isTemporarilyDisconnected
public boolean isTemporarilyDisconnected() -
canHandlePingRequest
protected boolean canHandlePingRequest()- Overrides:
canHandlePingRequest
in classClientHandlerStub
-
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 interfaceIClient
- Overrides:
disposeClient
in classClientHandlerStub
-
processInput
-
sendViaChannel
-
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 classClientHandlerStub
-
enqueueToRedoQueue
- Overrides:
enqueueToRedoQueue
in classClientHandlerStub
-
commitPoint
protected void commitPoint()- Overrides:
commitPoint
in classClientHandlerStub
-
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 classClientHandlerStub
-
canHandleBattleMoveNak
public boolean canHandleBattleMoveNak() -
canHandleAdvancedSync
public boolean canHandleAdvancedSync()- Overrides:
canHandleAdvancedSync
in classClientHandlerStub
-
cloneRedoQueue
-
initRedoQueueFromStub
-
reEnqueue
-
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 receivesyncRequestNumber
- 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
-
sendViaChannelRaw
-
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
-
doCallMethodInTryBlock
-
callMethod
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 executeargs
- A list of argument Strings
-
resolveBattleHex
-
resolveCreatureType
-
resolveCreatureTypeNullOk
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
-
resolveLegion
-
sendToClient
- Overrides:
sendToClient
in classClientHandlerStub
-
fakeDisconnectClient
public void fakeDisconnectClient() -
clearDisconnectClient
public void clearDisconnectClient() -
wasFakeDisconnectFlagSet
public boolean wasFakeDisconnectFlagSet()
-