SlideShare a Scribd company logo
1CONFIDENTIAL
NETWORKING
IN JAVA WITH
NIO AND NETTY
KANSTANTSIN SLISENKA
JUN 1, 2017
2CONFIDENTIAL
ABOUT ME
Java Backend engineer
Speaker at Java Tech Talks, SEC Online,
CMCC Tech Talks, IT Week
I’m interested in
Complex Java backend, SOA, databases
High load, fault-tolerant, distributed systems
KANSTANTSIN SLISENKA
EPAM Systems, Lead Software Engineer
3CONFIDENTIAL
WHY IS IMPORTANT TO DIG INTO JAVA NETWORKING
Classic Java project
Tomcat + Spring + Hibernate + …
High load, latency-sensitive
Custom TCP/UDP solution
4CONFIDENTIAL
AGENDA
Blocking vs non-blocking resources1
Blocking I/O2
Non-blocking I/O3
Netty: high performance networking framework4
5CONFIDENTIAL
BLOCKING VS NON-BLOCKING RESOURCES
client
thread
read/write
response
Blocking resources
Database transactions, RPC/WS calls
blocked
6CONFIDENTIAL
BLOCKING VS NON-BLOCKING RESOURCES
client
thread
read/write
response
client
thread
read/write
nope
read/write
response
client
thread
read/write
callback with
response
read/write
nope
register
callback
Blocking resources Non-blocking resources
Database transactions, RPC/WS calls Queues, WebSockets, Non-blocking data storage
blocked
7CONFIDENTIAL
NETWORK SOCKETS
Socket is blocking API over OS and Network hardware
not a physical object
PERMANENT
KNOWN PORT
ANY UNUSED
PORT
SOCKET SOCKET Max ports = 65535
8CONFIDENTIAL
JAVA SOCKETS = BLOCKING IO
Client Server
9CONFIDENTIAL
SOCKET SERVER
LIVE CODING EXAMPLE
10CONFIDENTIAL
Server
3
2 Client 2
Client 3
Client 1
SOCKET SERVER ARCHITECTURE
no data
no data
data transfer in progress
1
Socket
Socket
SocketThread
(blocked*)
Thread
(running)
Thread
(blocked*)
*until keep alive timeout
Fixed
thread pool
Requests
queue
11CONFIDENTIAL
Server
3
2 Client 2
Client 3
Client 1
SOCKET SERVER ARCHITECTURE
no data
no data
data transfer in progress
1
Socket
Socket
SocketThread
(blocked*)
Thread
(running)
Thread
(blocked*)
Client 4
*until keep alive timeout
Fixed
thread pool
Requests
queue
new
connection
12CONFIDENTIAL
Server
3
2 Client 2
Client 3
Client 1
SOCKET SERVER ARCHITECTURE
no data
no data
data transfer in progress
1
Socket
Socket
SocketThread
(blocked*)
Thread
(running)
Thread
(blocked*)
Client 4
*until keep alive timeout
Fixed
thread pool
Requests
queue
new
connection
drop by timeout
13CONFIDENTIAL
SOCKET SERVER CONCLUSION
1. Ineffective thread utilization
– many threads in waiting/blocked state
– extra memory for stack and thread local
resources
2. Poor performance
– context switching overhead
3. Limited number of connections
– when thread pool is fully consumed
Benefits Drawbacks
1. Simple development
well known Input/OutputStream API
2. No check for partially received
messages
thread is blocked until fully reads message
14CONFIDENTIAL
IO VS NIO
IO (blocking)
Thread Thread Thread
socket socket socket
BLOCKING READ/WRITE
WAIT WAIT WAITWAIT
15CONFIDENTIAL
IO VS NIO
IO (blocking) NIO (non-blocking)
NON BLOCKING READ/WRITE
Thread
buffer buffer buffer
socket
channel
socket
channel
socket
channel
Thread Thread Thread
socket socket socket
BLOCKING READ/WRITE
WAIT WAIT WAITWAIT ALWAYS
RUNNING
NOTIFICATIONS
selector
16CONFIDENTIAL
NIO DATA SENDING
Thread
buffer buffer buffer
socket
channel
socket
channel
selector
socket
channel
17CONFIDENTIAL
NIO DATA SENDING
Thread
buffer buffer buffer
socket
channel
socket
channel
selector
socket
channel
1 WRITE READY
18CONFIDENTIAL
NIO DATA SENDING
Thread
buffer buffer buffer
socket
channel
socket
channel
selector
PUT DATA2
socket
channel
1 WRITE READY
19CONFIDENTIAL
NIO DATA SENDING
Thread
buffer buffer buffer
socket
channel
socket
channel
selector
PUT DATA2
SEND DATA3
socket
channel
1 WRITE READY
20CONFIDENTIAL
NIO DATA RECEIVING
Thread
buffer buffer buffer
socket
channel
socket
channel
selector
socket
channel
21CONFIDENTIAL
NIO DATA RECEIVING
Thread
buffer buffer buffer
socket
channel
socket
channel
selector
RECEIVE DATA1
socket
channel
22CONFIDENTIAL
NIO DATA RECEIVING
Thread
buffer buffer buffer
socket
channel
socket
channel
selector
RECEIVE DATA1
socket
channel
2 READ READY
23CONFIDENTIAL
NIO DATA RECEIVING
Thread
buffer buffer buffer
socket
channel
socket
channel
selector
GET DATA3
RECEIVE DATA1
socket
channel
2 READ READY
24CONFIDENTIAL
NIO BYTE BUFFER
POSITION LIMIT CAPACITY
0 1 2 3 4 5 6 7 8 9
Empty buffer
BYTE
ARRAY
25CONFIDENTIAL
NIO BYTE BUFFER
POSITION LIMIT CAPACITY
0 1 2 3 4 5 6 7 8 9
1 0 1 1 0
LIMIT CAPACITY
Empty buffer
Writing mode
BYTE
ARRAY
BYTE
ARRAY
POSITION
0 1 2 3 4 5 6 7 8 9
26CONFIDENTIAL
NIO BYTE BUFFER
POSITION LIMIT CAPACITY
0 1 2 3 4 5 6 7 8 9
1 0 1 1 0
LIMIT CAPACITY
1 0 1 1 0
POSITION LIMIT CAPACITY
Empty buffer
Writing mode
Reading mode
BYTE
ARRAY
BYTE
ARRAY
BYTE
ARRAY
buffer.flip()buffer.clear() POSITION
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
27CONFIDENTIAL
DIRECT BUFFERS
0 1 2 3 4 5 6 7 8
JVM Network Interface Card
0 1 2 3 4 5 0 1 2 3 4 5
Physical memory
9
Shared memory
address space
Shared memory
address space
Memory should be
continuous because
NICs are block-
oriented devices
28CONFIDENTIAL
NIO SERVER
LIVE CODING EXAMPLE
29CONFIDENTIAL
Server
BASIC NIO SERVER ARCHITECTURE
buffer
Client #2
Client #1
no data
data transfer in progress
socket
channel #3 Client #3
data transfer in progress
buffer
socket
channel #2
socket
channel #1
WORKER THREAD
SELECTOR
SELECTOR
WORKER THREAD
buffer
Business
logic
30CONFIDENTIAL
Server
BASIC NIO SERVER ARCHITECTURE
buffer
Client #2
Client #1
no data
data transfer in progress
socket
channel #3 Client #3
data transfer in progress
buffer
socket
channel #2
socket
channel #1
WORKER THREAD
SELECTOR
SELECTOR
WORKER THREAD
buffer
Business
logic
31CONFIDENTIAL
Server
BASIC NIO SERVER ARCHITECTURE
buffer
Client #2
Client #1
no data
data transfer in progress
socket
channel #3 Client #3
data transfer in progress
buffer
get ready channels
socket
channel #2
socket
channel #1
WORKER THREAD
SELECTOR
SELECTOR
WORKER THREAD
buffer
Business
logic
32CONFIDENTIAL
Server
BASIC NIO SERVER ARCHITECTURE
buffer
Client #2
Client #1
no data
data transfer in progress
socket
channel #3 Client #3
data transfer in progress
get buffer
put
read
write
get ready channels
socket
channel #2
socket
channel #1
Business
logic
WORKER THREAD
SELECTOR
SELECTOR
WORKER THREAD
buffer
33CONFIDENTIAL
Server
BASIC NIO SERVER ARCHITECTURE
new
connection
buffer
Client #2
Client #4
Client #1
no data
data transfer in progress
new connection
socket
channel #3 Client #3
data transfer in progress
get buffer
put
register in selector
read
write
get ready channels
socket
channel #2
socket
channel #1
WORKER THREAD
SELECTOR
SELECTOR
WORKER THREAD
Business
logic
buffer
34CONFIDENTIAL
CAN WE GO TO PRODUCTION WITH A SINGLE THREAD?
https://www.pinterest.com/banjolele/one-man-band/
35CONFIDENTIAL
PRODUCTION-READY NIO SERVER
new
connection
36CONFIDENTIAL
SELECTOR
PRODUCTION-READY NIO SERVER
ServerSocket
Channel
acceptor
thread
new
connection
Acceptor threads
Separate thread to not lose incoming
connections when selector threads
are overloaded
37CONFIDENTIAL
SELECTOR
SELECTOR
PRODUCTION-READY NIO SERVER
ServerSocket
Channel
selector
thread
…
acceptor
thread
Socket
Channel
SELECTOR
selector
threadSocket
Channel
SELECTOR
selector
threadSocket
Channel
new
connection
Selector threads
Multiple processing threads to
get benefit from multi core CPU
Acceptor threads
Separate thread to not lose incoming
connections when selector threads
are overloaded
38CONFIDENTIAL
SELECTOR
SELECTOR
Application
thread pools
(long running tasks)
PRODUCTION-READY NIO SERVER
ServerSocket
Channel
selector
thread
…
worker
thread
worker
thread
worker
thread
application
thread
acceptor
thread
Socket
Channel
SELECTOR
selector
threadSocket
Channel
SELECTOR
selector
threadSocket
Channel
new
connection
Selector threads
Multiple processing threads to
get benefit from multi core CPU
Acceptor threads
Separate thread to not lose incoming
connections when selector threads
are overloaded
Application threads
For long tasks (back-end, DB,
computation), to avoid blocking
of selector threads
39CONFIDENTIAL
PARTIAL MESSAGE RECEIVING PROBLEM
Message reader splits/joins data blocks into messages
Data block
Message
Message Message
Message Message Message
message
reader
Data
block
Data
block
MessageMessage
Data
block
40CONFIDENTIAL
NIO CONCLUSION
Complexity
• complex code
• learning curve for developers
• handling partially received
messages
• combining async with sync code
(need different thread groups)
Benefits Drawbacks
Single shared thread for many
connections
• less memory
• less context switching overhead
41CONFIDENTIAL
NETTY
ONE FRAMEWORK TO RULE THEM ALL
42CONFIDENTIAL
NETTY: JAVA NETWORK FRAMEWORK
Some projects using Netty
43CONFIDENTIAL
NETTY SERVER ARCHITECTURE
Network
44CONFIDENTIAL
transport
Boss
EventLoopGroup
NIO
NETTY SERVER ARCHITECTURE
Network
Socket
Native JNI
Thread pool for
new connections
45CONFIDENTIAL
transport
Boss
EventLoopGroup
channel
channel pipeline
Worker EventLoopGroup EventExecutorGroup
NIO
NETTY SERVER ARCHITECTURE
Inbound
Handler
Inbound
Handler
Inbound
Handler
Outbound
Handler
Outbound
Handler
Outbound
Handler
Network
Socket
Native JNI
Separate thread pool
for blocking logic
I/O thread pool
For non-blocking logic
Thread pool for
new connections
46CONFIDENTIAL
channel
channel pipeline
NETTY HANDLERS
SSL
Handler
encrypted
encrypted
47CONFIDENTIAL
channel
channel pipeline
NETTY HANDLERS
HTTP
Request
Decoder
SSL
Handler
encrypted
encrypted
bytes
48CONFIDENTIAL
channel
channel pipeline
NETTY HANDLERS
HTTP
Request
Decoder
HTTP
Object
Aggregator
SSL
Handler
encrypted
encrypted
bytes
http
messages
buffer
49CONFIDENTIAL
channel
channel pipeline
NETTY HANDLERS
HTTP
Request
Decoder
HTTP
Object
Aggregator
SSL
Handler
encrypted
encrypted
bytes
http
messages Your
Business
Logic
Handler
full http
messages
buffer
50CONFIDENTIAL
channel
channel pipeline
NETTY HANDLERS
HTTP
Request
Decoder
HTTP
Object
Aggregator
HTTP
Request
Encoder
SSL
Handler
encrypted
encrypted
bytes
http
messages
bytes
Your
Business
Logic
Handler
full http
messages
buffer
full http
messages
51CONFIDENTIAL
NETTY SERVER
LIVE CODING EXAMPLE
52CONFIDENTIAL
WHAT IS FASTER: IO OR NIO?
53CONFIDENTIAL
WHAT IS FASTER: IO OR NIO?
May be yes, may be not *
?
?
?
?
NIO is faster
Context switching is
very slow
Threads take up too
much memory
Thread synchronization
will kill you
54CONFIDENTIAL
WHAT IS FASTER: IO OR NIO?
May be yes, may be not *
* Always point to holy-wars, see
www.mailinator.com/tymaPaulMultithreaded.pdf
?
?
?
Context switching is
very slow
Threads take up too
much memory
Thread synchronization
will kill you
IO is 25-30% faster
(see benchmark*)
NIO is faster
55CONFIDENTIAL
WHAT IS FASTER: IO OR NIO?
May be yes, may be not *
* Always point to holy-wars, see
www.mailinator.com/tymaPaulMultithreaded.pdf
?
?
Context switching is
very slow
Threads take up too
much memory
Thread synchronization
will kill you
IO is 25-30% faster
(see benchmark*)
NIO is faster
New POSIX library in Linux > 2.6
IDLE thread costs almost zero
Context switching is much much faster
56CONFIDENTIAL
WHAT IS FASTER: IO OR NIO?
May be yes, may be not *
* Always point to holy-wars, see
www.mailinator.com/tymaPaulMultithreaded.pdf
?
Context switching is
very slow
Threads take up too
much memory
Thread synchronization
will kill you
IO is 25-30% faster
(see benchmark*)
NIO is faster
New POSIX library in Linux > 2.6
IDLE thread costs almost zero
Context switching is much much faster
Don’t overuse thread-local objects!
57CONFIDENTIAL
WHAT IS FASTER: IO OR NIO?
May be yes, may be not *
* Always point to holy-wars, see
www.mailinator.com/tymaPaulMultithreaded.pdf
Context switching is
very slow
Threads take up too
much memory
Thread synchronization
will kill you
IO is 25-30% faster
(see benchmark*)
NIO is faster
New POSIX library in Linux > 2.6
IDLE thread costs almost zero
Context switching is much much faster
Don’t overuse thread-local objects!
Use non-blocking data structures
58CONFIDENTIAL
CONCLUSION
• Huge number of connections
• Medium or slow data rate per connection
• Asynchronous world (event-based)
• Non blocking database
• Queues
• Web-sockets
• Callbacks, listeners
• Data streaming
• Don’t use standard NIO, use frameworks like Netty
• Highly skilled team because of complex code
Use sockets* Use NIO*
*Not a strict rule, always point to holy-wars
• Small number of connections
• Huge data rate per connection
• Synchronous world (procedure-based)
• Classic enterprise applications
• Request-response protocols
• Blocking database
• Blocking RPC or web-service calls
• Bottleneck is not server, but blocking resource
• Make servers stateless and scale horizontally
59CONFIDENTIAL
Java Network
Programming, 4’th
edition
O’REILLY
Elliotte Rusty Harold
BUY A BOOK, MAKE THEM RICH
Netty in Action
Manning
Norman Maurer
Java NIO
O’REILLY
Ron Hitchens
• Code examples: github.com/kslisenko/java-networking
• NIO performance: www.mailinator.com/tymaPaulMultithreaded.pdf
• NIO tutorial: tutorials.jenkov.com/java-nio/index.html
• ITT 2015 - Heinz Kabutz - The Multi-threading, Non Blocking IO:
youtube.com/watch?v=uKc0Gx_lPsg
• Netty - One Framework to rule them all by Norman Maurer:
youtube.com/watch?v=DKJ0w30M0vg
• Scalable IO in Java: http://gee.cs.oswego.edu/dl/cpjslides/nio.pdf
60CONFIDENTIAL
THANK YOU! QUESTIONS?
kslisenko@gmail.com
kslisenko
linkedin.com/in/kslisenko/
Konstantin Slisenko
kanstantsin_slisenka@epam.com

More Related Content

PPTX
RedisConf17- Using Redis at scale @ Twitter
PDF
Apache ZooKeeper
PDF
Scaling WebRTC applications with Janus
PDF
Introduction to Apache Calcite
PDF
Introducing the Apache Flink Kubernetes Operator
PPTX
US China trade war
PDF
Fast federated SQL with Apache Calcite
PPTX
An Introduction to OAuth 2
RedisConf17- Using Redis at scale @ Twitter
Apache ZooKeeper
Scaling WebRTC applications with Janus
Introduction to Apache Calcite
Introducing the Apache Flink Kubernetes Operator
US China trade war
Fast federated SQL with Apache Calcite
An Introduction to OAuth 2

What's hot (20)

KEY
Non blocking io with netty
PPTX
Kafka 101
PDF
Consumer offset management in Kafka
PDF
Fundamentals of Apache Kafka
PPTX
Java nio ( new io )
PPTX
PDF
Apache Kafka Architecture & Fundamentals Explained
PDF
KSQL Intro
PPTX
Nginx Reverse Proxy with Kafka.pptx
PDF
Performance Tuning RocksDB for Kafka Streams' State Stores (Dhruba Borthakur,...
PDF
Producer Performance Tuning for Apache Kafka
PPTX
Apache Kafka
PDF
ksqlDB: A Stream-Relational Database System
PDF
High Availability PostgreSQL with Zalando Patroni
PDF
A Deep Dive into Kafka Controller
PDF
Scalability, Availability & Stability Patterns
PDF
CDC Stream Processing With Apache Flink With Timo Walther | Current 2022
PDF
Reactive Programming for a demanding world: building event-driven and respons...
PDF
Apache Kafka Introduction
PDF
An Introduction to Apache Kafka
Non blocking io with netty
Kafka 101
Consumer offset management in Kafka
Fundamentals of Apache Kafka
Java nio ( new io )
Apache Kafka Architecture & Fundamentals Explained
KSQL Intro
Nginx Reverse Proxy with Kafka.pptx
Performance Tuning RocksDB for Kafka Streams' State Stores (Dhruba Borthakur,...
Producer Performance Tuning for Apache Kafka
Apache Kafka
ksqlDB: A Stream-Relational Database System
High Availability PostgreSQL with Zalando Patroni
A Deep Dive into Kafka Controller
Scalability, Availability & Stability Patterns
CDC Stream Processing With Apache Flink With Timo Walther | Current 2022
Reactive Programming for a demanding world: building event-driven and respons...
Apache Kafka Introduction
An Introduction to Apache Kafka
Ad

Similar to Networking in Java with NIO and Netty (20)

PDF
WebSockets 101
PPT
12 module
PDF
PDF
Office Comunnications Server 2007 R2 Poster
PDF
Forward Networks - Networking Field Day 13 presentation
PPTX
Forward Networks - Networking Field Day 13 presentation
PPT
Client server
PDF
Linux Native, HTTP Aware Network Security
PDF
Getting a live_transcript_of_your_call_using_the_ari
PPTX
Application Visibility and Experience through Flexible Netflow
PDF
Shedding Light on LINE Token Economy You Won't Find in Our White Paper
PPTX
Jon McCoy - AppSec-USA-2014 Hacking C#(.NET) Applications:Defend by Design
PDF
Hermes Reliable Replication Protocol - ASPLOS'20 Presentation
PPTX
Lync 2010 deep dive edge
PDF
IRJET- Overview of Hole Punching: ICMP Hole Punching, TCP Hole Punching, UDP ...
PDF
Kafka Connect by Datio
PPT
Authenticated Identites in VoIP Call Control
PPT
Presentation To Vo Ip Round Table V2
PDF
Scaling big with Apache Kafka
PDF
IRJET - Overview of Hole Punching: ICMP Hole Punching, TCP Hole Punching, UDP...
WebSockets 101
12 module
Office Comunnications Server 2007 R2 Poster
Forward Networks - Networking Field Day 13 presentation
Forward Networks - Networking Field Day 13 presentation
Client server
Linux Native, HTTP Aware Network Security
Getting a live_transcript_of_your_call_using_the_ari
Application Visibility and Experience through Flexible Netflow
Shedding Light on LINE Token Economy You Won't Find in Our White Paper
Jon McCoy - AppSec-USA-2014 Hacking C#(.NET) Applications:Defend by Design
Hermes Reliable Replication Protocol - ASPLOS'20 Presentation
Lync 2010 deep dive edge
IRJET- Overview of Hole Punching: ICMP Hole Punching, TCP Hole Punching, UDP ...
Kafka Connect by Datio
Authenticated Identites in VoIP Call Control
Presentation To Vo Ip Round Table V2
Scaling big with Apache Kafka
IRJET - Overview of Hole Punching: ICMP Hole Punching, TCP Hole Punching, UDP...
Ad

More from Constantine Slisenka (11)

PDF
Unlocking the secrets of successful architects: what skills and traits do you...
PPTX
Lyft talks #4 Orchestrating big data and ML pipelines at Lyft
PDF
What does it take to be architect (for Cjicago JUG)
PDF
What does it take to be an architect
PDF
VoxxedDays Minsk - Building scalable WebSocket backend
PDF
Building scalable web socket backend
PDF
Latency tracing in distributed Java applications
PDF
Distributed transactions in SOA and Microservices
PPTX
Best practices of building data streaming API
PDF
Database transaction isolation and locking in Java
PDF
Profiling distributed Java applications
Unlocking the secrets of successful architects: what skills and traits do you...
Lyft talks #4 Orchestrating big data and ML pipelines at Lyft
What does it take to be architect (for Cjicago JUG)
What does it take to be an architect
VoxxedDays Minsk - Building scalable WebSocket backend
Building scalable web socket backend
Latency tracing in distributed Java applications
Distributed transactions in SOA and Microservices
Best practices of building data streaming API
Database transaction isolation and locking in Java
Profiling distributed Java applications

Recently uploaded (20)

PDF
AutoCAD Professional Crack 2025 With License Key
PPTX
CHAPTER 2 - PM Management and IT Context
PDF
Autodesk AutoCAD Crack Free Download 2025
PPTX
Operating system designcfffgfgggggggvggggggggg
PPTX
Embracing Complexity in Serverless! GOTO Serverless Bengaluru
PDF
Product Update: Alluxio AI 3.7 Now with Sub-Millisecond Latency
PPTX
history of c programming in notes for students .pptx
PDF
Designing Intelligence for the Shop Floor.pdf
PDF
wealthsignaloriginal-com-DS-text-... (1).pdf
PDF
Salesforce Agentforce AI Implementation.pdf
PDF
Wondershare Filmora 15 Crack With Activation Key [2025
PPTX
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
PDF
Design an Analysis of Algorithms I-SECS-1021-03
PDF
Cost to Outsource Software Development in 2025
PDF
iTop VPN 6.5.0 Crack + License Key 2025 (Premium Version)
PDF
Navsoft: AI-Powered Business Solutions & Custom Software Development
PPTX
AMADEUS TRAVEL AGENT SOFTWARE | AMADEUS TICKETING SYSTEM
PPTX
Advanced SystemCare Ultimate Crack + Portable (2025)
PPTX
Transform Your Business with a Software ERP System
PDF
Odoo Companies in India – Driving Business Transformation.pdf
AutoCAD Professional Crack 2025 With License Key
CHAPTER 2 - PM Management and IT Context
Autodesk AutoCAD Crack Free Download 2025
Operating system designcfffgfgggggggvggggggggg
Embracing Complexity in Serverless! GOTO Serverless Bengaluru
Product Update: Alluxio AI 3.7 Now with Sub-Millisecond Latency
history of c programming in notes for students .pptx
Designing Intelligence for the Shop Floor.pdf
wealthsignaloriginal-com-DS-text-... (1).pdf
Salesforce Agentforce AI Implementation.pdf
Wondershare Filmora 15 Crack With Activation Key [2025
Oracle E-Business Suite: A Comprehensive Guide for Modern Enterprises
Design an Analysis of Algorithms I-SECS-1021-03
Cost to Outsource Software Development in 2025
iTop VPN 6.5.0 Crack + License Key 2025 (Premium Version)
Navsoft: AI-Powered Business Solutions & Custom Software Development
AMADEUS TRAVEL AGENT SOFTWARE | AMADEUS TICKETING SYSTEM
Advanced SystemCare Ultimate Crack + Portable (2025)
Transform Your Business with a Software ERP System
Odoo Companies in India – Driving Business Transformation.pdf

Networking in Java with NIO and Netty