smpp-core vs Cloudhopper
A detailed comparison of modern smpp-core with the legacy Cloudhopper library
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:
- Update your dependency - Replace Cloudhopper with smpp-core in your pom.xml
- Update imports - Change from
com.cloudhopper.smpp.*toio.smppgateway.smpp.* - Refactor PDU creation - Use immutable builders instead of setters
- 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