How tootallnate/java-websocket works
Purpose and Distribution
Java-WebSocket is a Java 8+ library providing non-blocking, event-driven WebSocket client and server implementations over java.nio. It implements RFC 6455 and RFC 7692 per-message deflate, packaged for Maven/Gradle consumers. Build entry points are pom.xml and build.gradle; Java 9 module metadata is at src/main/java9/module-info.java.
Public Application Entry Points
Consumers subclass the abstract client or server endpoints and implement lifecycle callbacks (onOpen, onMessage, onClose, onError):
• Client connection API: src/main/java/org/java_websocket/client/WebSocketClient.java
• Server accept/event-loop API: src/main/java/org/java_websocket/server/WebSocketServer.java
• Shared connection contract and callback bridge: src/main/java/org/java_websocket/WebSocket.java, src/main/java/org/java_websocket/WebSocketListener.java, src/main/java/org/java_websocket/WebSocketAdapter.java
Runnable usage references are under src/main/example/ChatClient.java and src/main/example/ChatServer.java.
Transport and Event Loop Boundary
WebSocketServer owns server-side non-blocking socket acceptance and connection processing; WebSocketClient initiates outbound URI-based connections. Channel I/O is separated from protocol parsing so raw ByteBuffer reads/writes can work with plain or wrapped channels:
• src/main/java/org/java_websocket/SocketChannelIOHelper.java
• src/main/java/org/java_websocket/AbstractWrappedByteChannel.java
• src/main/java/org/java_websocket/WrappedByteChannel.java
The central per-connection engine is src/main/java/org/java_websocket/WebSocketImpl.java, which manages connection state, incoming byte processing, outgoing frames, and listener notification.
Handshake and Protocol Negotiation
The opening HTTP Upgrade exchange is modeled separately from connected-frame traffic. Handshake data/builders carry request/response headers and enable server acceptance or rejection:
• src/main/java/org/java_websocket/handshake/ClientHandshake.java
• src/main/java/org/java_websocket/handshake/ServerHandshake.java
• src/main/java/org/java_websocket/handshake/HandshakeImpl1Client.java
Draft abstracts wire-protocol behavior; Draft_6455 performs RFC 6455 handshake validation, frame translation, and extension/protocol negotiation:
• src/main/java/org/java_websocket/drafts/Draft.java
• src/main/java/org/java_websocket/drafts/Draft_6455.java
• src/main/java/org/java_websocket/protocols/Protocol.java
Frame Processing and Connection Lifecycle
After handshake completion, bytes flow through the selected draft into typed WebSocket frames, then to application callbacks. Outbound messages follow the reverse path: API send → frame encoding → channel write. Framing distinguishes text/binary data, fragmentation, ping/pong control traffic, and close semantics:
• src/main/java/org/java_websocket/framing/Framedata.java
• src/main/java/org/java_websocket/framing/FramedataImpl1.java
• src/main/java/org/java_websocket/framing/CloseFrame.java
Connection transitions and close-handshake rules are represented by src/main/java/org/java_websocket/enums/ReadyState.java and src/main/java/org/java_websocket/enums/CloseHandshakeType.java; malformed or invalid protocol input is surfaced via src/main/java/org/java_websocket/exceptions/InvalidDataException.
Extensions and Secure Transport
Extensions are negotiated during the opening handshake and applied at frame processing boundaries. The built-in RFC 7692 implementation provides per-message compression:
• src/main/java/org/java_websocket/extensions/IExtension.java
• src/main/java/org/java_websocket/extensions/permessage_deflate/PerMessageDeflateExtension.java
TLS/WSS is implemented through SSL channel wrappers and injectable client/server factories, using Java SSL infrastructure and caller-provided certificates/contexts:
• src/main/java/org/java_websocket/SSLSocketChannel2.java
• src/main/java/org/java_websocket/server/DefaultSSLWebSocketServerFactory.java
• src/main/java/org/java_websocket/server/CustomSSLWebSocketServerFactory.java
External Integration
The library depends on Java NIO/networking and Java SSL/TLS rather than an HTTP server framework. It emits logs through SLF4J, with binding selected by the consuming application. Maven Central is the intended artifact distribution channel. Autobahn interoperability artifacts and integration drivers are represented by autobahn reports/ and src/test/java/org/java_websocket/example/AutobahnServerTest.java.
Main entry points: WebSocketImpl.java WebSocketImpl · Draft_6455.java Draft / RFC 6455 · SocketChannelIOHelper.java Channel I/O helper · SSLSocketChannel2.java SSL socket channel
Components 19
Public API
Consumer extension points and contracts.
- WebSocketClient · Abstract outbound URI-based client API.
src/main/java/org/java_websocket/client/WebSocketClient.java - WebSocketServer · Abstract non-blocking accept and event-loop API.
src/main/java/org/java_websocket/server/WebSocketServer.java - WebSocket contract · Shared connection operations and callback bridge.
src/main/java/org/java_websocket/WebSocket.java - WebSocketAdapter
src/main/java/org/java_websocket/WebSocketAdapter.java
Connection Runtime
NIO transport and per-connection processing.
- WebSocketImpl · Owns connection state, byte processing, frames, and listener notification.
src/main/java/org/java_websocket/WebSocketImpl.java - Channel I/O helper · Reads and writes raw ByteBuffers.
src/main/java/org/java_websocket/SocketChannelIOHelper.java - Wrapped byte channel · Supports plain and wrapped socket channels.
src/main/java/org/java_websocket/WrappedByteChannel.java
WebSocket Protocol
Handshake negotiation and frame processing.
- Handshake models · Carries client and server request/response headers.
src/main/java/org/java_websocket/handshake/ClientHandshake.java - Draft / RFC 6455 · Validates upgrades, negotiates options, and translates frames.
src/main/java/org/java_websocket/drafts/Draft_6455.java - Protocol
src/main/java/org/java_websocket/protocols/Protocol.java - WebSocket frames · Data, fragmentation, control, and close frames.
src/main/java/org/java_websocket/framing/Framedata.java - Connection lifecycle
src/main/java/org/java_websocket/enums/ReadyState.java
Extensions & TLS
Optional compression and secure channel support.
- Per-message deflate · Negotiated compression at frame boundaries.
src/main/java/org/java_websocket/extensions/permessage_deflate/PerMessageDeflateExtension.java - SSL socket channel · Wraps NIO channels using Java SSL.
src/main/java/org/java_websocket/SSLSocketChannel2.java - SSL server factories · Injects default or custom server TLS configuration.
src/main/java/org/java_websocket/server/DefaultSSLWebSocketServerFactory.java
Other components
- Maven / Gradle build · Packages the Java library for consumers.
pom.xml - Java module metadata
src/main/java9/module-info.java - Java NIO / SSL · Socket, selector, and TLS infrastructure.
- SLF4J · Binding is selected by the consuming application.
Connections 20
- Maven / Gradle build → Java module metadata: packages with
- WebSocketClient → WebSocketImpl: creates / drives
- WebSocketServer → WebSocketImpl: accepts and drives
- WebSocketServer → Channel I/O helper: event-loop I/O
- WebSocketClient → Channel I/O helper: connection I/O
- WebSocket contract → WebSocketImpl: implemented by
- WebSocketAdapter → WebSocket contract: implements callbacks for
- WebSocketImpl → Channel I/O helper: writes outbound buffers
- Channel I/O helper → Wrapped byte channel: uses when wrapped
- WebSocketImpl → Draft / RFC 6455: delegates bytes and frames
- Draft / RFC 6455 → Handshake models: validates Upgrade
- Draft / RFC 6455 → Protocol: negotiates
- Draft / RFC 6455 → WebSocket frames: decodes / encodes
- WebSocketImpl → Connection lifecycle: transitions through
- Draft / RFC 6455 → Per-message deflate: negotiates and applies
- SSL server factories → SSL socket channel: creates
- SSL socket channel → Wrapped byte channel: wraps as
- Channel I/O helper → Java NIO / SSL: uses
- SSL socket channel → Java NIO / SSL: uses SSL
- WebSocketImpl → SLF4J: logs through