// 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 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
// 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
<!-- 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.