Package org.apache.tomcat.websocket
Class WsRemoteEndpointImplBase
- java.lang.Object
-
- org.apache.tomcat.websocket.WsRemoteEndpointImplBase
-
- All Implemented Interfaces:
RemoteEndpoint
- Direct Known Subclasses:
WsRemoteEndpointImplClient,WsRemoteEndpointImplServer
public abstract class WsRemoteEndpointImplBase extends java.lang.Object implements RemoteEndpoint
Base implementation of a WebSocket remote endpoint.
-
-
Nested Class Summary
-
Nested classes/interfaces inherited from interface jakarta.websocket.RemoteEndpoint
RemoteEndpoint.Async, RemoteEndpoint.Basic
-
-
Field Summary
Fields Modifier and Type Field Description protected java.util.concurrent.SemaphoremessagePartInProgressSemaphore to ensure only one message part is being processed at a time.protected static SendResultSENDRESULT_OKprotected static StringManagersmString manager for this class.
-
Constructor Summary
Constructors Constructor Description WsRemoteEndpointImplBase()Default constructor.
-
Method Summary
All Methods Instance Methods Abstract Methods Concrete Methods Modifier and Type Method Description protected booleanacquireMessagePartInProgressSemaphore(byte opCode, long timeoutExpiry)Acquire the semaphore that allows a message part to be written.voidclose()Closes all encoders associated with this endpoint.protected abstract voiddoClose()Performs the actual close operation on the underlying connection.protected abstract voiddoWrite(SendHandler handler, long blockingWriteTimeoutExpiry, java.nio.ByteBuffer... data)Writes data to the underlying connection.voidflushBatch()Flush any currently batched messages to the remote endpoint.booleangetBatchingAllowed()Obtains the current batching status of the endpoint.protected abstract java.util.concurrent.locks.LockgetLock()Returns the lock used for thread-safe operations.java.io.OutputStreamgetSendStream()Returns an OutputStream for sending binary data.longgetSendTimeout()Returns the send timeout in milliseconds.java.io.WritergetSendWriter()Returns a Writer for sending text data.protected abstract booleanisMasked()Checks if frames should be masked.voidsendBytes(java.nio.ByteBuffer data)Sends binary data to the remote endpoint.voidsendBytesByCompletion(java.nio.ByteBuffer data, SendHandler handler)Sends binary data asynchronously with a completion handler.java.util.concurrent.Future<java.lang.Void>sendBytesByFuture(java.nio.ByteBuffer data)Sends binary data asynchronously, returning a Future for completion tracking.voidsendObject(java.lang.Object obj)Sends an object to the remote endpoint using the appropriate encoder.voidsendObjectByCompletion(java.lang.Object obj, SendHandler completion)Sends an object asynchronously with a completion handler.java.util.concurrent.Future<java.lang.Void>sendObjectByFuture(java.lang.Object obj)Sends an object asynchronously, returning a Future for completion tracking.voidsendPartialBytes(java.nio.ByteBuffer partialByte, boolean last)Sends a partial binary message fragment.voidsendPartialString(java.lang.String fragment, boolean isLast)Sends a partial text message fragment.voidsendPing(java.nio.ByteBuffer applicationData)Send a ping message blocking until the message has been sent.voidsendPong(java.nio.ByteBuffer applicationData)Send a pong message blocking until the message has been sent.voidsendString(java.lang.String text)Sends a text message to the remote endpoint.voidsendStringByCompletion(java.lang.String text, SendHandler handler)Sends a text message asynchronously with a completion handler.java.util.concurrent.Future<java.lang.Void>sendStringByFuture(java.lang.String text)Sends a text message asynchronously, returning a Future for completion tracking.voidsetBatchingAllowed(boolean batchingAllowed)Enable or disable the batching of outgoing messages for this endpoint.protected voidsetEncoders(EndpointConfig endpointConfig)Initializes the encoders for this endpoint from the given endpoint configuration.voidsetSendTimeout(long timeout)Sets the send timeout in milliseconds.protected voidsetSession(WsSession wsSession)Sets the WebSocket session for this endpoint.protected voidsetTransformation(Transformation transformation)Sets the transformation for this endpoint.protected voidupdateStats(long payloadLength)Hook for updating server side statistics.
-
-
-
Field Detail
-
sm
protected static final StringManager sm
String manager for this class.
-
SENDRESULT_OK
protected static final SendResult SENDRESULT_OK
-
messagePartInProgress
protected final java.util.concurrent.Semaphore messagePartInProgress
Semaphore to ensure only one message part is being processed at a time.
-
-
Method Detail
-
setTransformation
protected void setTransformation(Transformation transformation)
Sets the transformation for this endpoint.- Parameters:
transformation- the transformation to use
-
getSendTimeout
public long getSendTimeout()
Returns the send timeout in milliseconds.- Returns:
- the send timeout
-
setSendTimeout
public void setSendTimeout(long timeout)
Sets the send timeout in milliseconds.- Parameters:
timeout- the send timeout
-
setBatchingAllowed
public void setBatchingAllowed(boolean batchingAllowed) throws java.io.IOExceptionDescription copied from interface:jakarta.websocket.RemoteEndpointEnable or disable the batching of outgoing messages for this endpoint. If batching is disabled when it was previously enabled then this method will block until any currently batched messages have been written.- Specified by:
setBatchingAllowedin interfaceRemoteEndpoint- Parameters:
batchingAllowed- New setting- Throws:
java.io.IOException- If changing the value resulted in a call toRemoteEndpoint.flushBatch()and that call threw anIOException.
-
getBatchingAllowed
public boolean getBatchingAllowed()
Description copied from interface:jakarta.websocket.RemoteEndpointObtains the current batching status of the endpoint.- Specified by:
getBatchingAllowedin interfaceRemoteEndpoint- Returns:
trueif batching is enabled, otherwisefalse.
-
flushBatch
public void flushBatch() throws java.io.IOExceptionDescription copied from interface:jakarta.websocket.RemoteEndpointFlush any currently batched messages to the remote endpoint. This method will block until the flush completes.- Specified by:
flushBatchin interfaceRemoteEndpoint- Throws:
java.io.IOException- If an I/O error occurs while flushing
-
sendBytes
public void sendBytes(java.nio.ByteBuffer data) throws java.io.IOExceptionSends binary data to the remote endpoint.- Parameters:
data- the binary data- Throws:
java.io.IOException- if a send error occurs
-
sendBytesByFuture
public java.util.concurrent.Future<java.lang.Void> sendBytesByFuture(java.nio.ByteBuffer data)
Sends binary data asynchronously, returning a Future for completion tracking.- Parameters:
data- the binary data- Returns:
- a Future that completes when the send is done
-
sendBytesByCompletion
public void sendBytesByCompletion(java.nio.ByteBuffer data, SendHandler handler)Sends binary data asynchronously with a completion handler.- Parameters:
data- the binary datahandler- the completion handler
-
sendPartialBytes
public void sendPartialBytes(java.nio.ByteBuffer partialByte, boolean last) throws java.io.IOExceptionSends a partial binary message fragment.- Parameters:
partialByte- the binary data fragmentlast- whether this is the last fragment- Throws:
java.io.IOException- if a send error occurs
-
sendPing
public void sendPing(java.nio.ByteBuffer applicationData) throws java.io.IOException, java.lang.IllegalArgumentExceptionDescription copied from interface:jakarta.websocket.RemoteEndpointSend a ping message blocking until the message has been sent. Note that if a message is in the process of being sent asynchronously, this method will block until that message and this ping has been sent.- Specified by:
sendPingin interfaceRemoteEndpoint- Parameters:
applicationData- The payload for the ping message- Throws:
java.io.IOException- If an I/O error occurs while sending the pingjava.lang.IllegalArgumentException- if the applicationData is too large for a control message (max 125 bytes)
-
sendPong
public void sendPong(java.nio.ByteBuffer applicationData) throws java.io.IOException, java.lang.IllegalArgumentExceptionDescription copied from interface:jakarta.websocket.RemoteEndpointSend a pong message blocking until the message has been sent. Note that if a message is in the process of being sent asynchronously, this method will block until that message and this pong has been sent.- Specified by:
sendPongin interfaceRemoteEndpoint- Parameters:
applicationData- The payload for the pong message- Throws:
java.io.IOException- If an I/O error occurs while sending the pongjava.lang.IllegalArgumentException- if the applicationData is too large for a control message (max 125 bytes)
-
sendString
public void sendString(java.lang.String text) throws java.io.IOExceptionSends a text message to the remote endpoint.- Parameters:
text- the text data- Throws:
java.io.IOException- if a send error occurs
-
sendStringByFuture
public java.util.concurrent.Future<java.lang.Void> sendStringByFuture(java.lang.String text)
Sends a text message asynchronously, returning a Future for completion tracking.- Parameters:
text- the text data- Returns:
- a Future that completes when the send is done
-
sendStringByCompletion
public void sendStringByCompletion(java.lang.String text, SendHandler handler)Sends a text message asynchronously with a completion handler.- Parameters:
text- the text datahandler- the completion handler
-
sendPartialString
public void sendPartialString(java.lang.String fragment, boolean isLast) throws java.io.IOExceptionSends a partial text message fragment.- Parameters:
fragment- the text fragmentisLast- whether this is the last fragment- Throws:
java.io.IOException- if a send error occurs
-
getSendStream
public java.io.OutputStream getSendStream()
Returns an OutputStream for sending binary data.- Returns:
- the output stream
-
getSendWriter
public java.io.Writer getSendWriter()
Returns a Writer for sending text data.- Returns:
- the writer
-
acquireMessagePartInProgressSemaphore
protected boolean acquireMessagePartInProgressSemaphore(byte opCode, long timeoutExpiry) throws java.lang.InterruptedExceptionAcquire the semaphore that allows a message part to be written.- Parameters:
opCode- The OPCODE for the message to be writtentimeoutExpiry- The time when the attempt to acquire the semaphore should expire- Returns:
trueif the semaphore is obtained, otherwisefalse.- Throws:
java.lang.InterruptedException- If the wait for the semaphore is interrupted
-
updateStats
protected void updateStats(long payloadLength)
Hook for updating server side statistics. Called on every frame written (including when batching is enabled and the frames are buffered locally until the buffer is full or is flushed).- Parameters:
payloadLength- Size of message payload
-
sendObject
public void sendObject(java.lang.Object obj) throws java.io.IOException, EncodeExceptionSends an object to the remote endpoint using the appropriate encoder.- Parameters:
obj- the object to send- Throws:
java.io.IOException- if a send error occursEncodeException- if encoding fails
-
sendObjectByFuture
public java.util.concurrent.Future<java.lang.Void> sendObjectByFuture(java.lang.Object obj)
Sends an object asynchronously, returning a Future for completion tracking.- Parameters:
obj- the object to send- Returns:
- a Future that completes when the send is done
-
sendObjectByCompletion
public void sendObjectByCompletion(java.lang.Object obj, SendHandler completion)Sends an object asynchronously with a completion handler.- Parameters:
obj- the object to sendcompletion- the completion handler
-
setSession
protected void setSession(WsSession wsSession)
Sets the WebSocket session for this endpoint.- Parameters:
wsSession- the session
-
setEncoders
protected void setEncoders(EndpointConfig endpointConfig) throws DeploymentException
Initializes the encoders for this endpoint from the given endpoint configuration.- Parameters:
endpointConfig- the endpoint configuration- Throws:
DeploymentException- if an encoder cannot be initialized
-
close
public final void close()
Closes all encoders associated with this endpoint.
-
doWrite
protected abstract void doWrite(SendHandler handler, long blockingWriteTimeoutExpiry, java.nio.ByteBuffer... data)
Writes data to the underlying connection.- Parameters:
handler- the send handlerblockingWriteTimeoutExpiry- the timeout expiry timedata- the data buffers to write
-
isMasked
protected abstract boolean isMasked()
Checks if frames should be masked.- Returns:
- true if masking is required
-
doClose
protected abstract void doClose()
Performs the actual close operation on the underlying connection.
-
getLock
protected abstract java.util.concurrent.locks.Lock getLock()
Returns the lock used for thread-safe operations.- Returns:
- the reentrant lock
-
-