Why Compare?

Cloudhopper was the de facto Java SMPP library for over a decade. However, it was abandoned in 2015 and hasn't received updates since. As Java has evolved significantly (Java 8 → Java 21), developers need a modern alternative that leverages current language features and best practices.

smpp-core is a clean-room implementation built from the ground up with Java 21, designed to be the actively maintained successor to Cloudhopper.

Feature Comparison

Feature smpp-core Cloudhopper
Java Version Java 21 LTS Java 8
Last Updated 2025 (Active) 2015 (Abandoned)
Maintenance Status Actively Maintained Abandoned
Virtual Threads Native Support Not Available
PDU Design Immutable Records Mutable Objects
Thread Safety Built-in (Immutable) Manual Synchronization
Pattern Matching Sealed Classes instanceof Chains
Auto-Reconnect Built-in Manual Implementation
TLS/SSL Support Full Support Limited
Request Windowing Built-in Available
Netty Transport Netty 4.1.x (Current) Netty 3.x (EOL)
SMPP 3.4 Compliance Full Full
Maven Central Available Available
Documentation Modern & Active Outdated
License Apache 2.0 Apache 2.0

Code Comparison

Creating a PDU - Cloudhopper (Mutable)

// Cloudhopper - mutable, not thread-safe
SubmitSm submit = new SubmitSm();
submit.setSourceAddress(new Address((byte)0x01, (byte)0x01, "12345"));
submit.setDestAddress(new Address((byte)0x01, (byte)0x01, "67890"));
submit.setShortMessage(CharsetUtil.encode("Hello", CharsetUtil.CHARSET_GSM));
submit.setRegisteredDelivery((byte)0x01);

Creating a PDU - smpp-core (Immutable)

// smpp-core - immutable, thread-safe by design
SubmitSm submit = SubmitSm.builder()
    .sourceAddress(new Address(TON.INTERNATIONAL, NPI.ISDN, "12345"))
    .destAddress(new Address(TON.INTERNATIONAL, NPI.ISDN, "67890"))
    .shortMessage("Hello", SmppCharset.GSM)
    .registeredDelivery(RegisteredDelivery.SMSC_RECEIPT_REQUESTED)
    .build();

Performance

smpp-core leverages Java 21's virtual threads for handling concurrent connections efficiently. This allows thousands of concurrent sessions without the overhead of platform threads.

Metric smpp-core Cloudhopper
Threading Model Virtual Threads Platform Threads
Memory per Connection ~1KB (virtual thread) ~1MB (platform thread)
Max Concurrent Sessions Millions Thousands
Buffer Handling Zero-copy (Netty 4) Copy-based (Netty 3)

Migration Guide

Migrating from Cloudhopper to smpp-core is straightforward:

  1. Update your dependency - Replace Cloudhopper with smpp-core in your pom.xml
  2. Update imports - Change from com.cloudhopper.smpp.* to io.smppgateway.smpp.*
  3. Refactor PDU creation - Use immutable builders instead of setters
  4. Update session handling - Leverage the cleaner callback interfaces

Dependency Change

<!-- Remove Cloudhopper -->
<dependency>
    <groupId>com.cloudhopper</groupId>
    <artifactId>ch-smpp</artifactId>
</dependency>

<!-- Add smpp-core -->
<dependency>
    <groupId>io.smppgateway</groupId>
    <artifactId>smpp-core</artifactId>
    <version>1.0.2</version>
</dependency>

The Verdict

If you're starting a new project or maintaining an existing SMPP application, smpp-core is the clear choice. It's actively maintained, built with modern Java, and designed for today's high-performance requirements.

Get Started with smpp-core