java.lang.Objectcom.realtime.crossfire.jxclient.server.socket.ClientSocket
public class ClientSocket
A socket that processes incoming data.
final ClientSocket clientSocket = new ClientSocket(...); clientSocket.writePacket(...); clientSocket.disconnect();
| Field Summary | |
|---|---|
private  java.util.Collection<ClientSocketListener> | 
clientSocketListeners
The ClientSocketListeners to notify. | 
private  DebugWriter | 
debugProtocol
The appender to write state changes to.  | 
private  boolean | 
disconnectPending
If set, notify listeners.  | 
private  java.lang.String | 
host
The host to connect to.  | 
private  byte[] | 
inputBuf
The receive buffer.  | 
private  java.nio.ByteBuffer | 
inputBuffer
The receive buffer.  | 
private  int | 
inputLen
If set to -1, a two-byte packet header is read next from
 inputBuffer. | 
private  int | 
interestOps
The currently set interest ops for selectionKey. | 
private  boolean | 
isConnected
Whether socketChannel is connected. | 
private static int | 
MAXIMUM_PACKET_SIZE
The maximum payload size of a Crossfire protocol packet.  | 
private  java.nio.ByteBuffer | 
outputBuffer
The output buffer.  | 
private  byte[] | 
packetHeader
A buffer for sending packets.  | 
private  int | 
port
The port to connect to.  | 
private  boolean | 
reconnect
Set if host or port has changed and thus a reconnect is
 needed. | 
private  boolean | 
reconnectIsError
Only valid if reconnect is set. | 
private  java.lang.String | 
reconnectReason
Only valid if reconnect is set. | 
private  java.nio.channels.SelectableChannel | 
selectableChannel
The SelectableChannel of socketChannel. | 
private  java.nio.channels.SelectionKey | 
selectionKey
The SelectionKey registered to selectableChannel. | 
private  java.nio.channels.Selector | 
selector
The Selector used for waiting. | 
private  java.nio.channels.SocketChannel | 
socketChannel
The SocketChannel when connected. | 
private  java.lang.Object | 
syncConnect
Synchronization object for reconnect, host, port, and disconnectPending. | 
private  java.lang.Object | 
syncOutput
Synchronization object for outputBuffer, selectionKey,
 interestOps, and socketChannel. | 
private  java.lang.Thread | 
thread
The Thread used to operate the socket. | 
| Constructor Summary | |
|---|---|
ClientSocket(DebugWriter debugProtocol)
Creates a new instance.  | 
|
| Method Summary | |
|---|---|
 void | 
addClientSocketListener(ClientSocketListener clientSocketListener)
Adds a ClientSocketListener to be notified. | 
 void | 
connect(java.lang.String host,
        int port)
Connects to a server.  | 
 void | 
disconnect(java.lang.String reason,
           boolean isError)
Terminates the connection.  | 
private  void | 
doConnect()
Processes pending connect requests.  | 
private  void | 
doReconnect()
Processes pending re- or disconnect requests.  | 
private  void | 
doTransceive()
Processes pending data to receive of transmit.  | 
private  void | 
process()
Reads/writes data from/to the socket.  | 
private  void | 
processConnect(java.lang.String host,
               int port)
Connects the socket.  | 
private  void | 
processDisconnect(java.lang.String reason,
                  boolean isError)
Disconnects the socket.  | 
private  void | 
processRead()
Reads data from the socket and parses the data into commands.  | 
private  void | 
processReadCommand()
Parses data from inputBuffer into commands. | 
private  void | 
processWrite()
Writes some pending data to the socket.  | 
 void | 
removeClientSocketListener(ClientSocketListener clientSocketListener)
Removes a ClientSocketListener to be notified. | 
 void | 
start()
Starts operation.  | 
 void | 
stop()
Stops operation.  | 
private  void | 
updateInterestOps()
Updates selectionKey's interest ops to match interestOps. | 
private  void | 
updateWriteInterestOps()
Updates interestOps's OP_WRITE
 according to whether outputBuffer has pending data. | 
 void | 
writePacket(byte[] buf,
            int len)
Writes a packet.  | 
| Methods inherited from class java.lang.Object | 
|---|
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait | 
| Field Detail | 
|---|
@NotNull private final java.util.Collection<ClientSocketListener> clientSocketListeners
ClientSocketListeners to notify.
@Nullable private final DebugWriter debugProtocol
null to not
 write anything.
private boolean disconnectPending
@Nullable private java.lang.String host
null for disconnect.
@NotNull private final byte[] inputBuf
inputBuffer.
@NotNull private final java.nio.ByteBuffer inputBuffer
private int inputLen
-1, a two-byte packet header is read next from
 inputBuffer. Otherwise it is set to the packet length which will
 be read from inputBuffer.
private int interestOps
selectionKey.
private boolean isConnected
socketChannel is connected.
private static final int MAXIMUM_PACKET_SIZE
@NotNull private final java.nio.ByteBuffer outputBuffer
@NotNull private final byte[] packetHeader
private int port
private boolean reconnect
host or port has changed and thus a reconnect is
 needed.
private boolean reconnectIsError
reconnect is set.
@NotNull private java.lang.String reconnectReason
reconnect is set.
@Nullable private java.nio.channels.SelectableChannel selectableChannel
SelectableChannel of socketChannel.
@Nullable private java.nio.channels.SelectionKey selectionKey
SelectionKey registered to selectableChannel. It's
 interesting ops are interestOps.
@NotNull private final java.nio.channels.Selector selector
Selector used for waiting.
@Nullable private java.nio.channels.SocketChannel socketChannel
SocketChannel when connected. Set to null when
 not connected.
@NotNull private final java.lang.Object syncConnect
reconnect, host, port, and disconnectPending.
@NotNull private final java.lang.Object syncOutput
outputBuffer, selectionKey,
 interestOps, and socketChannel.
@NotNull private final java.lang.Thread thread
Thread used to operate the socket.
| Constructor Detail | 
|---|
public ClientSocket(@Nullable
                    DebugWriter debugProtocol)
             throws java.io.IOException
debugProtocol - tf non-null, write all protocol
 commands to this writer
java.io.IOException - if the socket cannot be created| Method Detail | 
|---|
public void addClientSocketListener(@NotNull
                                    ClientSocketListener clientSocketListener)
ClientSocketListener to be notified.
clientSocketListener - the client socket listener to add
public void connect(@NotNull
                    java.lang.String host,
                    int port)
host - the host to connect toport - the port to connect to
public void disconnect(@NotNull
                       java.lang.String reason,
                       boolean isError)
reason - the reason for the disconnectisError - whether the disconnect is unexpected
private void doConnect()
                throws java.io.IOException
java.io.IOException - if an I/O error occurs
private void doReconnect()
                  throws java.io.IOException
java.io.IOException - if an I/O error occurs
private void doTransceive()
                   throws java.io.IOException
java.io.IOException - if an I/O error occursprivate void process()
thread has
 been interrupted.
private void processConnect(@NotNull
                            java.lang.String host,
                            int port)
                     throws java.io.IOException
host - the host to connect toport - the port to connect to
java.io.IOException - if an I/O error occurs
private void processDisconnect(@NotNull
                               java.lang.String reason,
                               boolean isError)
reason - the reason for disconnectionisError - whether the disconnect is unexpected
private void processRead()
                  throws java.io.IOException
java.io.IOException - if an I/O error occursprivate void processReadCommand()
inputBuffer into commands.
private void processWrite()
                   throws java.io.IOException
java.io.IOException - if an I/O error occurs
public void removeClientSocketListener(@NotNull
                                       ClientSocketListener clientSocketListener)
ClientSocketListener to be notified.
clientSocketListener - the client socket listener to removepublic void start()
public void stop()
          throws java.lang.InterruptedException
java.lang.InterruptedException - if stopping was interruptedprivate void updateInterestOps()
selectionKey's interest ops to match interestOps. Does nothing if selectionKey is
 null.
private void updateWriteInterestOps()
interestOps's OP_WRITE
 according to whether outputBuffer has pending data.
public void writePacket(@NotNull
                        byte[] buf,
                        int len)
This function may be called even if the socket has been closed. In this case he packet is discarded.
buf - the packet to sendlen - the number of bytes to send