Need help with setup, performance tuning, or custom SMPP development? Talk to us →

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

cloudhopper · mutablejava 8
// 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);
smpp-core · immutablejava 21
// 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
pom.xml · dependency changemaven
<!-- 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.9</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