Class WebSocketImpl

java.lang.Object
org.java_websocket.WebSocketImpl
All Implemented Interfaces:
WebSocket

public class WebSocketImpl extends Object implements WebSocket
Represents one end (client or server) of a single WebSocketImpl connection. Takes care of the "handshake" phase, then allows for easy sending of text frames, and receiving frames through an event-based model.
  • Field Details

    • DEFAULT_PORT

      public static final int DEFAULT_PORT
      The default port of WebSockets, as defined in the spec. If the nullary constructor is used, DEFAULT_PORT will be the port the WebSocketServer is binded to. Note that ports under 1024 usually require root permissions.
      See Also:
    • DEFAULT_WSS_PORT

      public static final int DEFAULT_WSS_PORT
      The default wss port of WebSockets, as defined in the spec. If the nullary constructor is used, DEFAULT_WSS_PORT will be the port the WebSocketServer is binded to. Note that ports under 1024 usually require root permissions.
      See Also:
    • log

      private final org.slf4j.Logger log
      Logger instance
      Since:
      1.4.0
    • outQueue

      public final BlockingQueue<ByteBuffer> outQueue
      Queue of buffers that need to be sent to the client.
    • inQueue

      public final BlockingQueue<ByteBuffer> inQueue
      Queue of buffers that need to be processed
    • wsl

      private final WebSocketListener wsl
      The listener to notify of WebSocket events.
    • key

      private SelectionKey key
    • channel

      private ByteChannel channel
      the possibly wrapped channel object whose selection is controlled by key
    • workerThread

      private WebSocketServer.WebSocketWorker workerThread
      Helper variable meant to store the thread which ( exclusively ) triggers this objects decode method.
    • flushandclosestate

      private boolean flushandclosestate
      When true no further frames may be submitted to be sent
    • readyState

      private volatile ReadyState readyState
      The current state of the connection
    • knownDrafts

      private List<Draft> knownDrafts
      A list of drafts available for this websocket
    • draft

      private Draft draft
      The draft which is used by this websocket
    • role

      private Role role
      The role which this websocket takes in the connection
    • tmpHandshakeBytes

      private ByteBuffer tmpHandshakeBytes
      the bytes of an incomplete received handshake
    • handshakerequest

      private ClientHandshake handshakerequest
      stores the handshake sent by this websocket ( Role.CLIENT only )
    • closemessage

      private String closemessage
    • closecode

      private Integer closecode
    • closedremotely

      private Boolean closedremotely
    • resourceDescriptor

      private String resourceDescriptor
    • lastPong

      private long lastPong
      Attribute, when the last pong was received
    • synchronizeWriteObject

      private final Object synchronizeWriteObject
      Attribut to synchronize the write
    • attachment

      private Object attachment
      Attribute to store connection attachment
      Since:
      1.3.7
  • Constructor Details

    • WebSocketImpl

      public WebSocketImpl(WebSocketListener listener, List<Draft> drafts)
      Creates a websocket with server role
      Parameters:
      listener - The listener for this instance
      drafts - The drafts which should be used
    • WebSocketImpl

      public WebSocketImpl(WebSocketListener listener, Draft draft)
      creates a websocket with client role
      Parameters:
      listener - The listener for this instance
      draft - The draft which should be used
  • Method Details

    • decode

      public void decode(ByteBuffer socketBuffer)
      Method to decode the provided ByteBuffer
      Parameters:
      socketBuffer - the ByteBuffer to decode
    • decodeHandshake

      private boolean decodeHandshake(ByteBuffer socketBufferNew)
      Returns whether the handshake phase has is completed. In case of a broken handshake this will be never the case.
    • decodeFrames

      private void decodeFrames(ByteBuffer socketBuffer)
    • closeConnectionDueToWrongHandshake

      private void closeConnectionDueToWrongHandshake(InvalidDataException exception)
      Close the connection if the received handshake was not correct
      Parameters:
      exception - the InvalidDataException causing this problem
    • closeConnectionDueToInternalServerError

      private void closeConnectionDueToInternalServerError(RuntimeException exception)
      Close the connection if there was a server error by a RuntimeException
      Parameters:
      exception - the RuntimeException causing this problem
    • generateHttpResponseDueToError

      private ByteBuffer generateHttpResponseDueToError(int errorCode)
      Generate a simple response for the corresponding endpoint to indicate some error
      Parameters:
      errorCode - the http error code
      Returns:
      the complete response as ByteBuffer
    • close

      public void close(int code, String message, boolean remote)
    • close

      public void close(int code, String message)
      Description copied from interface: WebSocket
      sends the closing handshake. may be send in response to an other handshake.
      Specified by:
      close in interface WebSocket
      Parameters:
      code - the closing code
      message - the closing message
    • closeConnection

      public void closeConnection(int code, String message, boolean remote)
      This will close the connection immediately without a proper close handshake. The code and the message therefore won't be transferred over the wire also they will be forwarded to onClose/onWebsocketClose.
      Parameters:
      code - the closing code
      message - the closing message
      remote - Indicates who "generated" code.
      true means that this endpoint received the code from the other endpoint.
      false means this endpoint decided to send the given code,
      remote may also be true if this endpoint started the closing handshake since the other endpoint may not simply echo the code but close the connection the same time this endpoint does do but with an other code.
    • closeConnection

      protected void closeConnection(int code, boolean remote)
    • closeConnection

      public void closeConnection()
    • closeConnection

      public void closeConnection(int code, String message)
      Description copied from interface: WebSocket
      This will close the connection immediately without a proper close handshake. The code and the message therefore won't be transferred over the wire also they will be forwarded to onClose/onWebsocketClose.
      Specified by:
      closeConnection in interface WebSocket
      Parameters:
      code - the closing code
      message - the closing message
    • flushAndClose

      public void flushAndClose(int code, String message, boolean remote)
    • eot

      public void eot()
    • close

      public void close(int code)
      Description copied from interface: WebSocket
      sends the closing handshake. may be send in response to an other handshake.
      Specified by:
      close in interface WebSocket
      Parameters:
      code - the closing code
    • close

      public void close(InvalidDataException e)
    • send

      public void send(String text)
      Send Text data to the other end.
      Specified by:
      send in interface WebSocket
      Parameters:
      text - the text data to send
      Throws:
      WebsocketNotConnectedException - websocket is not yet connected
    • send

      public void send(ByteBuffer bytes)
      Send Binary data (plain bytes) to the other end.
      Specified by:
      send in interface WebSocket
      Parameters:
      bytes - the binary data to send
      Throws:
      IllegalArgumentException - the data is null
      WebsocketNotConnectedException - websocket is not yet connected
    • send

      public void send(byte[] bytes)
      Description copied from interface: WebSocket
      Send Binary data (plain bytes) to the other end.
      Specified by:
      send in interface WebSocket
      Parameters:
      bytes - the byte array to send
    • send

      private void send(Collection<Framedata> frames)
    • sendFragmentedFrame

      public void sendFragmentedFrame(Opcode op, ByteBuffer buffer, boolean fin)
      Description copied from interface: WebSocket
      Allows to send continuous/fragmented frames conveniently.
      For more into on this frame type see http://tools.ietf.org/html/rfc6455#section-5.4

      If the first frame you send is also the last then it is not a fragmented frame and will received via onMessage instead of onFragmented even though it was send by this method.

      Specified by:
      sendFragmentedFrame in interface WebSocket
      Parameters:
      op - This is only important for the first frame in the sequence. Opcode.TEXT, Opcode.BINARY are allowed.
      buffer - The buffer which contains the payload. It may have no bytes remaining.
      fin - true means the current frame is the last in the sequence.
    • sendFrame

      public void sendFrame(Collection<Framedata> frames)
      Description copied from interface: WebSocket
      Send a collection of frames to the other end
      Specified by:
      sendFrame in interface WebSocket
      Parameters:
      frames - the frames to send to the other end
    • sendFrame

      public void sendFrame(Framedata framedata)
      Description copied from interface: WebSocket
      Send a frame to the other end
      Specified by:
      sendFrame in interface WebSocket
      Parameters:
      framedata - the frame to send to the other end
    • sendPing

      public void sendPing() throws NullPointerException
      Description copied from interface: WebSocket
      Send a ping to the other end
      Specified by:
      sendPing in interface WebSocket
      Throws:
      NullPointerException
    • hasBufferedData

      public boolean hasBufferedData()
      Description copied from interface: WebSocket
      Checks if the websocket has buffered data
      Specified by:
      hasBufferedData in interface WebSocket
      Returns:
      has the websocket buffered data
    • startHandshake

      public void startHandshake(ClientHandshakeBuilder handshakedata) throws InvalidHandshakeException
      Throws:
      InvalidHandshakeException
    • write

      private void write(ByteBuffer buf)
    • write

      private void write(List<ByteBuffer> bufs)
      Write a list of bytebuffer (frames in binary form) into the outgoing queue
      Parameters:
      bufs - the list of bytebuffer
    • open

      private void open(Handshakedata d)
    • isOpen

      public boolean isOpen()
      Description copied from interface: WebSocket
      Is the websocket in the state OPEN
      Specified by:
      isOpen in interface WebSocket
      Returns:
      state equals ReadyState.OPEN
    • isClosing

      public boolean isClosing()
      Description copied from interface: WebSocket
      Is the websocket in the state CLOSING
      Specified by:
      isClosing in interface WebSocket
      Returns:
      state equals ReadyState.CLOSING
    • isFlushAndClose

      public boolean isFlushAndClose()
      Description copied from interface: WebSocket
      Returns true when no further frames may be submitted
      This happens before the socket connection is closed.
      Specified by:
      isFlushAndClose in interface WebSocket
      Returns:
      true when no further frames may be submitted
    • isClosed

      public boolean isClosed()
      Description copied from interface: WebSocket
      Is the websocket in the state CLOSED
      Specified by:
      isClosed in interface WebSocket
      Returns:
      state equals ReadyState.CLOSED
    • getReadyState

      public ReadyState getReadyState()
      Description copied from interface: WebSocket
      Retrieve the WebSocket 'ReadyState'. This represents the state of the connection. It returns a numerical value, as per W3C WebSockets specs.
      Specified by:
      getReadyState in interface WebSocket
      Returns:
      Returns '0 = CONNECTING', '1 = OPEN', '2 = CLOSING' or '3 = CLOSED'
    • setSelectionKey

      public void setSelectionKey(SelectionKey key)
      Parameters:
      key - the selection key of this implementation
    • getSelectionKey

      public SelectionKey getSelectionKey()
      Returns:
      the selection key of this implementation
    • toString

      public String toString()
      Overrides:
      toString in class Object
    • getRemoteSocketAddress

      public InetSocketAddress getRemoteSocketAddress()
      Description copied from interface: WebSocket
      Returns the address of the endpoint this socket is connected to, or null if it is unconnected.
      Specified by:
      getRemoteSocketAddress in interface WebSocket
      Returns:
      the remote socket address or null, if this socket is unconnected
    • getLocalSocketAddress

      public InetSocketAddress getLocalSocketAddress()
      Description copied from interface: WebSocket
      Returns the address of the endpoint this socket is bound to, or null if it is not bound.
      Specified by:
      getLocalSocketAddress in interface WebSocket
      Returns:
      the local socket address or null, if this socket is not bound
    • getDraft

      public Draft getDraft()
      Description copied from interface: WebSocket
      Getter for the draft
      Specified by:
      getDraft in interface WebSocket
      Returns:
      the used draft
    • close

      public void close()
      Description copied from interface: WebSocket
      Convenience function which behaves like close(CloseFrame.NORMAL)
      Specified by:
      close in interface WebSocket
    • getResourceDescriptor

      public String getResourceDescriptor()
      Description copied from interface: WebSocket
      Returns the HTTP Request-URI as defined by http://tools.ietf.org/html/rfc2616#section-5.1.2
      If the opening handshake has not yet happened it will return null.
      Specified by:
      getResourceDescriptor in interface WebSocket
      Returns:
      Returns the decoded path component of this URI.
    • getLastPong

      long getLastPong()
      Getter for the last pong received
      Returns:
      the timestamp for the last received pong
    • updateLastPong

      public void updateLastPong()
      Update the timestamp when the last pong was received
    • getWebSocketListener

      public WebSocketListener getWebSocketListener()
      Getter for the websocket listener
      Returns:
      the websocket listener associated with this instance
    • getAttachment

      public <T> T getAttachment()
      Description copied from interface: WebSocket
      Getter for the connection attachment.
      Specified by:
      getAttachment in interface WebSocket
      Type Parameters:
      T - The type of the attachment
      Returns:
      Returns the user attachment
    • hasSSLSupport

      public boolean hasSSLSupport()
      Description copied from interface: WebSocket
      Does this websocket use an encrypted (wss/ssl) or unencrypted (ws) connection
      Specified by:
      hasSSLSupport in interface WebSocket
      Returns:
      true, if the websocket does use wss and therefore has a SSLSession
    • getSSLSession

      public SSLSession getSSLSession()
      Description copied from interface: WebSocket
      Returns the ssl session of websocket, if ssl/wss is used for this instance.
      Specified by:
      getSSLSession in interface WebSocket
      Returns:
      the ssl session of this websocket instance
    • getProtocol

      public IProtocol getProtocol()
      Description copied from interface: WebSocket
      Returns the used Sec-WebSocket-Protocol for this websocket connection
      Specified by:
      getProtocol in interface WebSocket
      Returns:
      the Sec-WebSocket-Protocol or null, if no draft available
    • setAttachment

      public <T> void setAttachment(T attachment)
      Description copied from interface: WebSocket
      Setter for an attachment on the socket connection. The attachment may be of any type.
      Specified by:
      setAttachment in interface WebSocket
      Type Parameters:
      T - The type of the attachment
      Parameters:
      attachment - The object to be attached to the user
    • getChannel

      public ByteChannel getChannel()
    • setChannel

      public void setChannel(ByteChannel channel)
    • getWorkerThread

      public WebSocketServer.WebSocketWorker getWorkerThread()
    • setWorkerThread

      public void setWorkerThread(WebSocketServer.WebSocketWorker workerThread)