Apache Thrift Java Library - A lightweight, language-independent software stack for point-to-point RPC implementation providing clean abstractions and implementations for data transport, data serialization, and application level processing
—
Various transport implementations for different communication needs. Transports provide the underlying data transmission layer for Thrift protocols, supporting different communication patterns from simple sockets to HTTP and memory buffers.
Core transport interfaces and abstract classes that all transport implementations extend.
/**
* Abstract base class for all transport implementations
*/
public abstract class TTransport implements Closeable {
/** Check if transport is open and ready for operations */
public abstract boolean isOpen();
/** Open the transport connection */
public abstract void open() throws TTransportException;
/** Close the transport connection */
public abstract void close();
/** Read data from transport into buffer */
public abstract int read(byte[] buf, int off, int len) throws TTransportException;
/** Read exactly the specified number of bytes (blocking) */
public int readAll(byte[] buf, int off, int len) throws TTransportException;
/** Write data from buffer to transport */
public abstract void write(byte[] buf, int off, int len) throws TTransportException;
/** Flush any pending writes */
public abstract void flush() throws TTransportException;
// Buffer access methods for buffered transports
/** Get internal buffer (may return null for non-buffered) */
public byte[] getBuffer();
/** Get current position in buffer */
public int getBufferPosition();
/** Get remaining bytes in buffer */
public int getBytesRemainingInBuffer();
/** Consume bytes from buffer */
public void consumeBuffer(int len);
/** Peek at buffer data without consuming */
public ByteBuffer getByteBuffer(int len);
/** Utility methods for reading/writing complete byte arrays */
public void write(byte[] buf) throws TTransportException;
public int read(byte[] buf) throws TTransportException;
}
/**
* Factory interface for creating transport instances
*/
public class TTransportFactory {
/** Create transport instance (default: return same transport) */
public TTransport getTransport(TTransport trans);
}
/**
* Abstract base class for server-side transports
*/
public abstract class TServerTransport implements Closeable {
/** Start listening for connections */
public abstract void listen() throws TTransportException;
/** Accept a new client connection */
public abstract TTransport accept() throws TTransportException;
/** Close the server transport */
public abstract void close();
/** Interrupt any blocking accept() calls */
public void interrupt();
}
/**
* Base class for endpoint-based transports with host/port information
*/
public abstract class TEndpointTransport extends TTransport {
/** Get host name or address */
public abstract String getHost();
/** Get port number */
public abstract int getPort();
}Standard TCP socket-based transport implementations for network communication.
/**
* Client-side TCP socket transport
*/
public class TSocket extends TEndpointTransport {
/** Create socket transport to host:port with default timeout */
public TSocket(String host, int port) throws TTransportException;
/** Create socket transport with specific timeout */
public TSocket(String host, int port, int timeout) throws TTransportException;
/** Create socket transport with detailed configuration */
public TSocket(TConfiguration config, String host, int port, int socketTimeout, int connectTimeout) throws TTransportException;
/** Create socket transport wrapping existing socket */
public TSocket(Socket socket) throws TTransportException;
/** Set socket timeout for read operations */
public void setTimeout(int timeout);
/** Set connection timeout for initial connection */
public void setConnectTimeout(int timeout);
/** Set socket timeout (same as setTimeout) */
public void setSocketTimeout(int timeout);
/** Get the underlying socket */
public Socket getSocket();
/** Get host name */
public String getHost();
/** Get port number */
public int getPort();
/** Check if socket is connected */
public boolean isOpen();
/** Open socket connection */
public void open() throws TTransportException;
/** Close socket connection */
public void close();
}
/**
* Server-side TCP socket transport
*/
public class TServerSocket extends TServerTransport {
/** Create server socket on specified port */
public TServerSocket(int port) throws TTransportException;
/** Create server socket on specified port with timeout */
public TServerSocket(int port, int timeout) throws TTransportException;
/** Create server socket bound to specific address */
public TServerSocket(InetSocketAddress bindAddr) throws TTransportException;
/** Create server socket bound to address with timeout */
public TServerSocket(InetSocketAddress bindAddr, int timeout) throws TTransportException;
/** Create server socket wrapping existing ServerSocket */
public TServerSocket(ServerSocket socket) throws TTransportException;
/** Set accept timeout */
public void setTimeout(int timeout);
/** Get the underlying ServerSocket */
public ServerSocket getServerSocket();
/** Start listening for connections */
public void listen() throws TTransportException;
/** Accept new client connection */
public TTransport accept() throws TTransportException;
/** Close server socket */
public void close();
}Usage Examples:
import org.apache.thrift.transport.TSocket;
import org.apache.thrift.transport.TServerSocket;
import org.apache.thrift.transport.TTransportException;
// Client socket with default timeout
try {
TSocket clientSocket = new TSocket("localhost", 9090);
clientSocket.open();
// Use socket...
clientSocket.close();
} catch (TTransportException e) {
// Handle connection error
}
// Client socket with custom timeout
TSocket timedSocket = new TSocket("remote.example.com", 9090, 5000);
// Server socket
TServerSocket serverSocket = new TServerSocket(9090);
serverSocket.listen();
while (running) {
TTransport clientTransport = serverSocket.accept();
// Handle client...
}
serverSocket.close();Non-blocking socket implementations for high-performance async operations.
/**
* Non-blocking client socket transport using NIO
*/
public class TNonblockingSocket extends TNonblockingTransport {
/** Create non-blocking socket to host:port */
public TNonblockingSocket(String host, int port) throws IOException;
/** Create non-blocking socket with timeout */
public TNonblockingSocket(String host, int port, int timeout) throws IOException;
/** Create non-blocking socket wrapping existing channel */
public TNonblockingSocket(SocketChannel socketChannel, int timeout, SelectionKey selectionKey) throws IOException;
/** Start non-blocking connection */
public boolean startConnect() throws IOException;
/** Complete non-blocking connection */
public boolean finishConnect() throws IOException;
/** Get SelectionKey for this socket */
public SelectionKey getSelectionKey();
/** Get the socket channel */
public SocketChannel getSocketChannel();
}
/**
* Non-blocking server socket transport using NIO
*/
public class TNonblockingServerSocket extends TNonblockingServerTransport {
/** Create non-blocking server socket on port */
public TNonblockingServerSocket(int port) throws TTransportException;
/** Create non-blocking server socket bound to address */
public TNonblockingServerSocket(InetSocketAddress bindAddr) throws TTransportException;
/** Create non-blocking server socket with specific bind address and client address */
public TNonblockingServerSocket(InetSocketAddress bindAddr, InetSocketAddress clientAddr) throws TTransportException;
/** Register with selector for accept operations */
public void registerSelector(Selector selector) throws IOException;
/** Accept new non-blocking connection */
public TNonblockingTransport accept() throws TTransportException;
/** Get the server socket channel */
public ServerSocketChannel getServerSocketChannel();
}
/**
* Abstract base class for non-blocking transports
*/
public abstract class TNonblockingTransport extends TTransport {
/** Start non-blocking connect operation */
public abstract boolean startConnect() throws IOException;
/** Complete non-blocking connect operation */
public abstract boolean finishConnect() throws IOException;
/** Get SelectionKey for NIO operations */
public abstract SelectionKey getSelectionKey();
/** Non-blocking read operation */
public abstract int read(ByteBuffer buffer) throws IOException;
/** Non-blocking write operation */
public abstract int write(ByteBuffer buffer) throws IOException;
}HTTP-based transport implementations for web services and firewalls.
/**
* HTTP client transport for web services
*/
public class THttpClient extends TEndpointTransport {
/** Create HTTP client for URL */
public THttpClient(String url) throws TTransportException;
/** Create HTTP client for URL with configuration */
public THttpClient(String url, TConfiguration config) throws TTransportException;
/** Create HTTP client for URL object */
public THttpClient(URL url) throws TTransportException;
/** Create HTTP client for URL with configuration */
public THttpClient(URL url, TConfiguration config) throws TTransportException;
/** Set connection timeout */
public void setConnectTimeout(int timeout);
/** Set read timeout */
public void setReadTimeout(int timeout);
/** Set custom HTTP headers */
public void setCustomHeaders(Map<String, String> headers);
/** Set user agent string */
public void setUserAgent(String userAgent);
/** Get URL */
public URL getUrl();
/** Get host from URL */
public String getHost();
/** Get port from URL */
public int getPort();
}Usage Examples:
import org.apache.thrift.transport.THttpClient;
import java.util.HashMap;
import java.util.Map;
// Basic HTTP client
THttpClient httpClient = new THttpClient("http://api.example.com/thrift");
// HTTP client with custom headers
THttpClient customClient = new THttpClient("https://secure-api.example.com/rpc");
Map<String, String> headers = new HashMap<>();
headers.put("Authorization", "Bearer " + token);
headers.put("X-API-Version", "1.0");
customClient.setCustomHeaders(headers);
// HTTP client with timeouts
customClient.setConnectTimeout(5000); // 5 second connect timeout
customClient.setReadTimeout(30000); // 30 second read timeoutIn-memory transport implementations for testing and local communication.
/**
* In-memory transport using byte array buffer
*/
public class TMemoryBuffer extends TTransport {
/** Create memory buffer with initial capacity */
public TMemoryBuffer(int size);
/** Create memory buffer wrapping existing byte array */
public TMemoryBuffer(byte[] bytes);
/** Get current length of data in buffer */
public int length();
/** Get the internal byte array */
public byte[] getArray();
/** Convert buffer contents to string */
public String toString(String charset) throws UnsupportedEncodingException;
/** Clear the buffer */
public void clear();
/** Always returns true (memory buffer is always "open") */
public boolean isOpen();
/** No-op for memory buffer */
public void open();
/** No-op for memory buffer */
public void close();
}
/**
* Read-only memory transport for existing byte arrays
*/
public class TMemoryInputTransport extends TTransport {
/** Create read-only transport from byte array */
public TMemoryInputTransport(byte[] buf);
/** Create read-only transport from byte array subset */
public TMemoryInputTransport(byte[] buf, int offset, int length);
/** Get number of bytes remaining to read */
public int bytesRemainingInBuffer();
/** Get the buffer */
public byte[] getBuffer();
/** Get current buffer position */
public int getBufferPosition();
/** Reset to beginning of buffer */
public void reset();
}Usage Examples:
import org.apache.thrift.transport.TMemoryBuffer;
import org.apache.thrift.transport.TMemoryInputTransport;
// Create memory buffer for serialization
TMemoryBuffer buffer = new TMemoryBuffer(1024);
// Serialize object to buffer...
byte[] serializedData = buffer.getArray();
// Create read-only transport from existing data
TMemoryInputTransport inputTransport = new TMemoryInputTransport(serializedData);
// Deserialize from input transport...
// Memory buffer for testing
TMemoryBuffer testBuffer = new TMemoryBuffer(256);
testBuffer.write("test data".getBytes());
System.out.println("Buffer contains: " + testBuffer.length() + " bytes");Stream-based transports for file I/O and generic stream operations.
/**
* Transport implementation using input/output streams
*/
public class TIOStreamTransport extends TTransport {
/** Create transport with input and output streams */
public TIOStreamTransport(InputStream inputStream, OutputStream outputStream);
/** Create read-only transport with input stream */
public TIOStreamTransport(InputStream inputStream);
/** Create write-only transport with output stream */
public TIOStreamTransport(OutputStream outputStream);
/** Get the input stream */
public InputStream getInputStream();
/** Get the output stream */
public OutputStream getOutputStream();
/** Always returns true if streams are not null */
public boolean isOpen();
/** No-op (streams should be managed externally) */
public void open();
/** Close the underlying streams */
public void close();
}
/**
* File-based transport for reading/writing files
*/
public class TFileTransport extends TTransport {
/** Create file transport for reading and/or writing */
public TFileTransport(String path, boolean read) throws IOException;
/** Create file transport with read and append options */
public TFileTransport(String path, boolean read, boolean append) throws IOException;
/** Get the file path */
public String getPath();
/** Check if file is open */
public boolean isOpen();
/** Open the file */
public void open() throws TTransportException;
/** Close the file */
public void close();
}Transport wrappers that add functionality like framing, compression, and buffering.
/**
* Frame-based transport wrapper that prefixes data with length
*/
public class TFramedTransport extends TLayeredTransport {
/** Default maximum frame size */
public static final int DEFAULT_MAX_LENGTH = 16384000;
/** Create framed transport with default max length */
public TFramedTransport(TTransport transport);
/** Create framed transport with specified max length */
public TFramedTransport(TTransport transport, int maxLength);
/** Clear write buffer without sending */
public void clear();
/** Factory for creating framed transports */
public static class Factory extends TTransportFactory {
/** Create factory with default max length */
public Factory();
/** Create factory with specified max length */
public Factory(int maxLength);
public TTransport getTransport(TTransport base);
}
}
/**
* Optimized framed transport with better performance characteristics
*/
public class TFastFramedTransport extends TLayeredTransport {
/** Create fast framed transport with default settings */
public TFastFramedTransport(TTransport underlying);
/** Create fast framed transport with custom buffer sizes */
public TFastFramedTransport(TTransport underlying, int initialCapacity, int maxLength);
/** Factory for creating fast framed transports */
public static class Factory extends TTransportFactory {
/** Create factory with default settings */
public Factory();
/** Create factory with custom settings */
public Factory(int initialCapacity, int maxLength);
public TTransport getTransport(TTransport base);
}
}
/**
* Abstract base class for layered transports
*/
public abstract class TLayeredTransport extends TTransport {
/** The underlying transport */
protected TTransport transport;
/** Create layered transport */
public TLayeredTransport(TTransport transport);
/** Get the underlying transport */
public TTransport getInnerTransport();
}Usage Examples:
import org.apache.thrift.transport.TFramedTransport;
import org.apache.thrift.transport.TSocket;
// Create framed transport for message boundaries
TSocket socket = new TSocket("localhost", 9090);
TFramedTransport framedTransport = new TFramedTransport(socket);
// Use framed transport factory
TFramedTransport.Factory factory = new TFramedTransport.Factory();
TTransport clientTransport = factory.getTransport(socket);
// Fast framed transport with custom buffer size
TFastFramedTransport fastFramed = new TFastFramedTransport(socket, 8192, 1024*1024);Transport implementations with SASL (Simple Authentication and Security Layer) support.
/**
* Client-side SASL transport for authentication
*/
public class TSaslClientTransport extends TSaslTransport {
/** Create SASL client transport */
public TSaslClientTransport(String mechanism, String authorizationId, String protocol,
String serverName, Map<String, String> props,
CallbackHandler cbh, TTransport transport) throws SaslException;
/** Create SASL client transport with SaslClient */
public TSaslClientTransport(SaslClient saslClient, TTransport transport);
}
/**
* Server-side SASL transport for authentication
*/
public class TSaslServerTransport extends TSaslTransport {
/** Create SASL server transport */
public TSaslServerTransport(String mechanism, String protocol, String serverName,
Map<String, String> props, CallbackHandler cbh,
TTransport transport) throws SaslException;
/** Create SASL server transport with SaslServer */
public TSaslServerTransport(SaslServer saslServer, TTransport transport);
}
/**
* Abstract base class for SASL transports
*/
public abstract class TSaslTransport extends TLayeredTransport {
/** Check if SASL negotiation is complete */
public boolean isComplete();
/** Get negotiated security strength */
public String getNegotiatedProperty(String propName);
}Specific exception types for transport-related errors.
/**
* Exception class for transport-related errors
*/
public class TTransportException extends TException {
public static final int UNKNOWN = 0;
public static final int NOT_OPEN = 1;
public static final int ALREADY_OPEN = 2;
public static final int TIMED_OUT = 3;
public static final int END_OF_FILE = 4;
public static final int INTERRUPTED = 5;
public static final int CORRUPTED_DATA = 6;
/** Create exception with unknown type */
public TTransportException();
/** Create exception with specific type */
public TTransportException(int type);
/** Create exception with type and message */
public TTransportException(int type, String message);
/** Create exception with message */
public TTransportException(String message);
/** Create exception with type and cause */
public TTransportException(int type, Throwable cause);
/** Create exception with cause */
public TTransportException(Throwable cause);
/** Get the exception type */
public int getType();
}Usage Examples for Exception Handling:
import org.apache.thrift.transport.TTransportException;
try {
transport.open();
// Use transport...
} catch (TTransportException e) {
switch (e.getType()) {
case TTransportException.NOT_OPEN:
// Handle not open error
break;
case TTransportException.TIMED_OUT:
// Handle timeout
break;
case TTransportException.END_OF_FILE:
// Handle unexpected EOF
break;
default:
// Handle other errors
}
}Install with Tessl CLI
npx tessl i tessl/maven-org-apache-thrift--libthrift