SlideShare a Scribd company logo
1 of 64
Nio In action 
Avec Netty 
2014-09-10 Nio In Action Avec Netty 1
2014-09-10 Nio In Action Avec Netty 2
Agenda ____________ 
• Oio 
• Nio 
• Channel, Buffer & Selector 
• Zero Copy 
• DirectBuffer 
• Netty 
• Asynchrone & EventDriven 
• Transport 
• ChannelHandler 
• Bootstrap 
• TestU 
• Demo 
2014-09-10 Nio In Action Avec Netty 3
@mouloumouhcine 
Consultant Java & 
Scala 
Mouhcine.moulou@soat.fr 
2014-09-10 Nio In Action Avec Netty 4
Netty 
2014-09-10 Nio In Action Avec Netty 5
Références 
2014-09-10 Nio In Action Avec Netty 6
Références 
2014-09-10 Nio In Action Avec Netty 7
Un peu d’histoire 
- Blocking IO depuis la première version Java 
- Arrivé de Nio à partir de jdk 1.4 
- Nio 2 depuis jdk 1.7 
2014-09-10 Nio In Action Avec Netty 8
Blocking IO 
- Un Thread par connexion 
- Appel bloquant 
- Api bas niveau 
( nb de thread Max) 
() 
(complexité) 
2014-09-10 Nio In Action Avec Netty 9
Blocking IO 
ServerSocket socket = new ServerSocket(port); 
while (true) { 
final Socket clientSocket = socket.accept(); 
new Thread(new Runnable() { 
public void run() { 
// TODO 
} 
}).start(); 
} 
2014-09-10 Nio In Action Avec Netty 10
New (Non Blocking) IO 
- Utilisation « Propre » des resources. 
- Un Thread exécute une ou plusieurs Tâches 
- Les événements IO sont gérés par le « selector » 
2014-09-10 Nio In Action Avec Netty 11
New (Non Blocking) IO 
Channel 
• Similaire au Stream 
• Lecture & écriture dans le même Channel (Possible en 
Asynchrone) 
• Lecture | écriture depuis | dans un Buffer 
2014-09-10 Nio In Action Avec Netty 12
New (Non Blocking) IO 
2014-09-10 Nio In Action Avec Netty 13
New (Non Blocking) IO 
2014-09-10 Nio In Action Avec Netty 14
New (Non Blocking) IO 
2014-09-10 Nio In Action Avec Netty 15
New (Non Blocking) IO 
2014-09-10 Nio In Action Avec Netty 16
New (Non Blocking) IO 
Buffer 
• Conteneur de données 
• Lecture & écriture 
• Propriétés 
• Position 
• Limit 
• capacity 
2014-09-10 Nio In Action Avec Netty 17
New (Non Blocking) IO 
Buffer 
• Conteneur de données 
• Lecture & écriture 
• Propriétés 
• Position 
• Limit 
• capacity 
2014-09-10 Nio In Action Avec Netty 18
Buffer 
SocketChannel channel = server.accept(); 
byteBuffer buffer ; 
channel.read(buffer); 
// … 
buffer.flip(); 
channel.write(buffer); 
output.compact(); // ou clear() 
2014-09-10 Nio In Action Avec Netty 19
Buffer 
ByteBuffer bbuf = ByteBuffer.allocate(10); 
int capacity = bbuf.capacity(); // 10 
bbuf.put(0, (byte)9); // position=0 
bbuf.position(5); 
// relative put() 
bbuf.put((byte)’a’); 
int pos = bbuf.position(); // 6 
count int rem = bbuf.remaining(); // 4 
bbuf.limit(7); // remaining=1 
2014-09-10 Nio In Action Avec Netty 20
Buffer 
2014-09-10 Nio In Action Avec Netty 21
New (Non Blocking) IO 
Selector 
• Gère le changement d’état d’une ou plusieurs Connexions (Channel) 
• Un Selector  Un Thread 
• Un Channel S’enregistre dans un Selector (avec un « interest set ») 
• OP_READ , OP_WRITE, OP_ACCEPT, OP_CONNECT 
channel.register(selector, OP_WRITE | OP_READ); 
2014-09-10 Nio In Action Avec Netty 22
Modèle NiO 
Thread 
Selector 
Channel Channel Channel 
Buffer 
2014-09-10 Nio In Action Avec Netty 23
Exemple 
ServerSocketChannel serverChannel = ServerSocketChannel.open(); 
ServerSocket ss = serverChannel.socket(); 
ss.bind(new InetSocketAddress(port)); 
selector = Selector.open(); 
serverChannel.register(selector, SelectionKey.OP_ACCEPT); 
while (true) { 
selector.select(); 
Set readyKeys = selector.selectedKeys(); 
Iterator iterator = readyKeys.iterator(); 
while (iterator.hasNext()) { 
} 
}
Nouveautés Nio 
Zero Copy 
• Lecture Contenu Statique, puis écriture dans la socket 
while(inputStream.read(bytes) > 0) { 
socket.getOutputStream().write(bytes); 
} 
2014-09-10 Nio In Action Avec Netty 25
Nouveautés Nio 
Avant NIO 
Application 
Lecture 
Copie 
Copie 
File Copie 
Read buffer Socket Buffer 
Context 
D’application 
Context 
Du Kernel 
Network 
2014-09-10 Nio In Action Avec Netty 26
Zero Copy 
Application 
Copie 
transferTo(position, count, target) 
File Read buffer 
Context 
D’application 
Context 
Du Kernel 
Socket buffer 
Network 
Copie 
2014-09-10 Nio In Action Avec Netty 27
Nouveautés Nio 
Direct Buffer 
• Implémentation ByteBuffer 
• Mémoire allouée hors Heap Java (Hors mémoire JVM) 
ByteBuffer buffer = ByteBuffer.allocateDirect(capacity); 
• Pas de GC (plutôt sun.misc.Cleaner) 
2014-09-10 Nio In Action Avec Netty 28
Nouveautés Nio 
Demo Unsafe ? 
2014-09-10 Nio In Action Avec Netty 29
Nio … Pas si simple 
o Nio est une Api Complexe 
o Single Threaded (Selector) 
o L’implémentation du select() dépend du SE 
o le « Epoll() bug » 
o Complexité d’utilisation du Buffer 
2014-09-10 Nio In Action Avec Netty 30
Netty … à la rescousse 
2014-09-10 Nio In Action Avec Netty 31
Netty 
⦿ Crée par Trustin Lee (RedHat, Twitter à partir de 2011) 
⦿ Twitter & RedHat sont les grands contr 
⦿ Netty se base sur un Model Asynchrone & EventDriven 
2014-09-10 Nio In Action Avec Netty 32
Asynchrone … Kesako 
⦿ Les opérations I / O ne sont pas bloquantes 
⦿ Notification à la fin de l’opération (Callback, Future) 
⦿ ChannelFutureListener 
⦿ isSuccess() & isError() 
⦿add(ChannelFutureListener listener) 
2014-09-10 Nio In Action Avec Netty 33
Asynchrone …Netty 
Channel channel = ...; 
ChannelFuture future = channel.connect(new InetSocketAddress(“192.168.0.1“, 25); 
future.addListener(new ChannelFutureListener() { 
public void operationComplete(ChannelFuture future) { 
if (future.isSuccess()) { 
// TODO 
} else { 
Throwable cause = future.cause(); 
cause.printStacktrace(); 
} 
} 
}); 
2014-09-10 Nio In Action Avec Netty 34
Netty … Event Driven 
⦿ Netty utilise des événements pour informer l'utilisateur sur des changements 
d’état. 
⦿ Connexion active 
⦿ déconnexion 
⦿ Écriture & lécture 
⦿ Distinction entre les événements entrants et sortants 
2014-09-10 Nio In Action Avec Netty 35
Transports 
OIO 
NIO 
&( SAOsy_nTcIhMroEOneU?T W) TF 
Embedded 
Local 
Et plus à l’avenir .... 
2014-09-10 Nio In Action Avec Netty 36
Protocol 
TCP 
UDP 
SCTP 
UDT 
2014-09-10 Nio In Action Avec Netty 37
Buffer 
⦿ Index lecture & index écriture 
⦿ Composite Buffer 
⦿ Pooling …! 
⦿ Reference Counting 
2014-09-10 Nio In Action Avec Netty 38
Buffer 
⦿ Index lecture & index écriture 
⦿ readerIndex & writerIndex 
Discardable Bytes Readable Bytes Writable Bytes 
0 <= readerIndex <= writerIndex <= capacity 
⦿ Un Buffer Netty est extensible 
⦿ Initialapacity & MaxCapacity 
2014-09-10 Nio In Action Avec Netty 39
Buffer 
ByteBuf buffer = ...; 
while (buffer.readable()) { 
System.out.println(buffer.readByte()); 
} 
Buffer.discardReadBytes(); 
ByteBuf buffer = ...; 
while (buffer.writableBytes() >= 4) { 
buffer.writeInt(random.nextInt()); 
} 
2014-09-10 Nio In Action Avec Netty 40
Buffer 
Allocation 
⦿ ByteBufAllocator 
⦿ Pooled & Unpooled 
⦿ buffer(int) 
⦿ buffer(int, int) 
⦿ directBuffer() 
⦿ directBuffer(int) 
⦿ directBuffer(int, int) 
2014-09-10 Nio In Action Avec Netty 
41
Buffer 
Pooled Buffer 
⦿ Depuis Netty 4 
⦿ Moins d’opérations GC à cause d’allocation | désallocation des Buffers 
⦿ Utilisation du « jemalloc » 
⦿ Meilleur performance dans un environnement « multithreading » 
2014-09-10 Nio In Action Avec Netty 
42
Buffer 
Reference Counting 
⦿ ByteBuf implémente « ReferenceCounted » 
⦿ Améliore la gestion d’allocation | désallocation pour le Buffer 
ByteBuf buf = ctx.alloc().directBuffer(); 
assert buf.refCnt() == 1; 
2014-09-10 Nio In Action Avec Netty 
43
Buffer 
Benchmark (netty 3 vs netty 4 avec PooledBuffer) 
⦿ EchoServer 
⦿ 16000 connexions concurrentes 
⦿ Messages 256 bytes en boucle 
2014-09-10 Nio In Action Avec Netty 44
Buffer 
2014-09-10 Nio In Action Avec Netty 45
Channel Handler 
⦿ Les opérations IO sont gérés par le ChannelHandler 
⦿ Découplage du Process Métier 
⦿ Type-Safe 
⦿ Inbound Handler 
⦿ Données reçues 
⦿ Outbound Handler 
⦿ Données à envoyer 
2014-09-10 Nio In Action Avec Netty 46
Channel Pipeline 
2014-09-10 Nio In Action Avec Netty 47
ChannelPipeline 
⦿ Implementation par défault : DefaultChannelPipeline 
⦿ addFirst(…) 
⦿ addBefore(…) 
⦿ addAfter(…) 
⦿ addLast(…) 
⦿ remove(…) 
⦿ replace(…) 
⦿ iterator() 
⦿ LIFO pour les messages entrantes 
⦿ FIFO pour les messages sortantes 
2014-09-10 Nio In Action Avec Netty 48
ChannelPipeline 
ChannelPipeline pipeline = ..; 
FirstHandler firstHandler = new FirstHandler(); 
pipeline.addLast(“handler1“, firstHandler); 
pipeline.addFirst(“handler2“, new SecondHandler()); 
pipeline.addLast(“handler3“, new ThirdHandler()); 
pipeline.remove(“handler3“); 
pipeline.remove(firstHandler); 
pipeline.replace(“handler2“, “handler4“, new FourthHandler()); 
2014-09-10 Nio In Action Avec Netty 49
ChannelInboundHandler 
⦿ Traite les données entrantes (données reçues) 
⦿ channelRegistered(…) 
⦿ channelActive(…) 
⦿ channelActive(…) 
⦿ channelReadComplete(…) 
⦿ channelRead(…) 
2014-09-10 Nio In Action Avec Netty 50
ChannelInboundHandler 
2014-09-10 Nio In Action Avec Netty 51
ChannelInboundHandler 
@Sharable 
public class FirstHandler extends SimpleChannelInboundHandler { 
@Override 
public void channelRead(ChannelHandlerContext ctx, Object msg) { 
// … 
} 
} 
2014-09-10 Nio In Action Avec Netty 52
ChannelOutboundHandler 
⦿ Gère les données & opérations sortantes 
⦿ ChannelOutboundHandler 
⦿ disconnect(…) 
⦿ deregister(…) 
⦿ Flush() 
2014-09-10 Nio In Action Avec Netty 53
Encoder & Decoder 
⦿ Encodage & décodage des données envoyées dans le réseau 
2014-09-10 Nio In Action Avec Netty 54
Decoder 
⦿ ByteToMessageDecoder & MessageToMessageDecoder 
⦿ Decode() 
⦿ decodeLast() 
ChannelPipeline 
Inbound ByteBuf 
Decoder ChannelInboundHandler 
decode 
2014-09-10 Nio In Action Avec Netty 55
Codec 
⦿ Encodage & décodage dans le même class 
⦿ Methodes de l’Encoder & du Decoder 
⦿ Decode(), decodeLast(), encode() 
⦿ ByteToMessageCodec, MessageToMessageCodec, 
CombinedChannelDuplexHandler 
2014-09-10 Nio In Action Avec Netty 56
Decoder 
@Override 
public void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) 
throws Exception { 
if (in.readableBytes() < 2) { 
return; 
} 
ByteBuf buf = ctx.alloc().buffer(); 
while (in.readableBytes() >= 2) { 
char c = in.readChar(); 
buf.writeChar(Character.toLowerCase(c)); 
} 
out.add(buf); 
} 
2014-09-10 Nio In Action Avec Netty 57
Implémentations 
ChannelHandler & Codec 
HTTP 
WebSockets 
Serialization 
JbossMarshaling 
Protobuf 
SSL 
2014-09-10 Nio In Action Avec Netty 58
UTest 
⦿ Possibilité de tester U les channelHandler avec le type de transport 
« embedded » 
⦿ EmbeddedChannel 
⦿ Écrire des données entrantes ou sortantes 
⦿ Vérifier le bon fonctionnement (Encodage / Decodage) 
⦿ writeInbound 
⦿ readInbound 
⦿ writeOutbound 
⦿ readOutbound 
2014-09-10 Nio In Action Avec Netty 59
Netty … Bootstrap 
⦿ configuration des appli Client /serveur Netty 
⦿ ServerBootstrap  Server 
⦿ Bootstrap  Client 
2014-09-10 Nio In Action Avec Netty 60
Demo 
2014-09-10 Nio In Action Avec Netty 61
Conclusion 
⦿ Objectifs 
⦿ Fonctionnement de base Netty 
⦿ Avec Netty, le developpement des applications réseau est beacoup plus simple 
⦿ Netty … À l’avenir 
⦿ Support Java 8 
⦿ Support Andoird 
⦿ Plus de codecs & ChannelHandler 
⦿ Contribuez … ! 
2014-09-10 Nio In Action Avec Netty 62
2014-09-10 Nio In Action Avec Netty 63
2014-09-10 TEST_Cliquez et modifiez le pied de page 64

More Related Content

Viewers also liked

Apache Mina
Apache MinaApache Mina
Apache Minalake xie
 
Rapid Network Application Development with Apache MINA
Rapid Network Application Development with Apache MINARapid Network Application Development with Apache MINA
Rapid Network Application Development with Apache MINAtrustinlee
 
Building High Performance Scalable TCP/IP Servers with Apache MINA
Building High Performance Scalable TCP/IP Servers with Apache MINABuilding High Performance Scalable TCP/IP Servers with Apache MINA
Building High Performance Scalable TCP/IP Servers with Apache MINAelliando dias
 

Viewers also liked (8)

Apache Mina
Apache MinaApache Mina
Apache Mina
 
Introduction to Apache MINA
Introduction to Apache MINAIntroduction to Apache MINA
Introduction to Apache MINA
 
Rapid Network Application Development with Apache MINA
Rapid Network Application Development with Apache MINARapid Network Application Development with Apache MINA
Rapid Network Application Development with Apache MINA
 
Mina2
Mina2Mina2
Mina2
 
NIO 2
NIO 2NIO 2
NIO 2
 
Netty
NettyNetty
Netty
 
Building High Performance Scalable TCP/IP Servers with Apache MINA
Building High Performance Scalable TCP/IP Servers with Apache MINABuilding High Performance Scalable TCP/IP Servers with Apache MINA
Building High Performance Scalable TCP/IP Servers with Apache MINA
 
Netty4.x
Netty4.xNetty4.x
Netty4.x
 

Similar to Nio sur Netty par Mouhcine Moulou - 3 avril 2014

Devoxx: Tribulation d'un développeur sur le Cloud
Devoxx: Tribulation d'un développeur sur le CloudDevoxx: Tribulation d'un développeur sur le Cloud
Devoxx: Tribulation d'un développeur sur le CloudTugdual Grall
 
IPv6 training
IPv6 trainingIPv6 training
IPv6 trainingFred Bovy
 
React Native - Développez vos application native en JS
React Native - Développez vos application native en JSReact Native - Développez vos application native en JS
React Native - Développez vos application native en JSYann Duval
 
Les nouveautés du Framework .NET 4.5
Les nouveautés du Framework .NET 4.5Les nouveautés du Framework .NET 4.5
Les nouveautés du Framework .NET 4.5Microsoft
 
OpenStack dans la pratique
OpenStack dans la pratiqueOpenStack dans la pratique
OpenStack dans la pratiqueOsones
 
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos SantosXebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos SantosPublicis Sapient Engineering
 
Déploiement pour l’hébergement d’architecture cliente et mise en place du Sel...
Déploiement pour l’hébergement d’architecture cliente et mise en place du Sel...Déploiement pour l’hébergement d’architecture cliente et mise en place du Sel...
Déploiement pour l’hébergement d’architecture cliente et mise en place du Sel...OpenNebula Project
 
Retour AFUP du forumphp 2017
Retour AFUP du forumphp 2017Retour AFUP du forumphp 2017
Retour AFUP du forumphp 2017AFUP_Limoges
 
OpenStack - open source au service du Cloud
OpenStack - open source au service du CloudOpenStack - open source au service du Cloud
OpenStack - open source au service du CloudLINAGORA
 
Réactif, parallèle, asynchrone. Pourquoi!
Réactif, parallèle, asynchrone. Pourquoi!Réactif, parallèle, asynchrone. Pourquoi!
Réactif, parallèle, asynchrone. Pourquoi!Henri Tremblay
 
Intégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsIntégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsHugo Hamon
 
Présentation IPV6 ANWARNET 2010
Présentation IPV6 ANWARNET 2010Présentation IPV6 ANWARNET 2010
Présentation IPV6 ANWARNET 2010Fadi Gouasmia
 
memoire utilisation de Puppet et Nagios
memoire utilisation de Puppet et Nagiosmemoire utilisation de Puppet et Nagios
memoire utilisation de Puppet et Nagiosabouaalexis
 
RSocket un protocole réseau pour les Reactive Streams
RSocket un protocole réseau pour les Reactive StreamsRSocket un protocole réseau pour les Reactive Streams
RSocket un protocole réseau pour les Reactive StreamsVMware Tanzu
 
OpenStack & DevOps, l'Open Source au service du Cloud
OpenStack & DevOps, l'Open Source au service du CloudOpenStack & DevOps, l'Open Source au service du Cloud
OpenStack & DevOps, l'Open Source au service du CloudMichel-Marie Maudet
 
Présentation Système d’exploitation Open Source Lepton - MEITO Mai 2014
Présentation Système d’exploitation Open Source Lepton - MEITO Mai 2014Présentation Système d’exploitation Open Source Lepton - MEITO Mai 2014
Présentation Système d’exploitation Open Source Lepton - MEITO Mai 2014O10ée
 
[Devoxx] Comment Betclic utilise son datalake pour générer des tests de charg...
[Devoxx] Comment Betclic utilise son datalake pour générer des tests de charg...[Devoxx] Comment Betclic utilise son datalake pour générer des tests de charg...
[Devoxx] Comment Betclic utilise son datalake pour générer des tests de charg...Nicolas JOZWIAK
 

Similar to Nio sur Netty par Mouhcine Moulou - 3 avril 2014 (20)

Python après 15 ans de JAVA
Python après 15 ans de JAVAPython après 15 ans de JAVA
Python après 15 ans de JAVA
 
Devoxx: Tribulation d'un développeur sur le Cloud
Devoxx: Tribulation d'un développeur sur le CloudDevoxx: Tribulation d'un développeur sur le Cloud
Devoxx: Tribulation d'un développeur sur le Cloud
 
IPv6 training
IPv6 trainingIPv6 training
IPv6 training
 
React Native - Développez vos application native en JS
React Native - Développez vos application native en JSReact Native - Développez vos application native en JS
React Native - Développez vos application native en JS
 
Les nouveautés du Framework .NET 4.5
Les nouveautés du Framework .NET 4.5Les nouveautés du Framework .NET 4.5
Les nouveautés du Framework .NET 4.5
 
OpenStack dans la pratique
OpenStack dans la pratiqueOpenStack dans la pratique
OpenStack dans la pratique
 
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos SantosXebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
XebiCon'17 : Kotlin, état de l'art - Benjamin Lacroix et Sergio Dos Santos
 
Déploiement pour l’hébergement d’architecture cliente et mise en place du Sel...
Déploiement pour l’hébergement d’architecture cliente et mise en place du Sel...Déploiement pour l’hébergement d’architecture cliente et mise en place du Sel...
Déploiement pour l’hébergement d’architecture cliente et mise en place du Sel...
 
See i pv6
See i pv6See i pv6
See i pv6
 
Retour AFUP du forumphp 2017
Retour AFUP du forumphp 2017Retour AFUP du forumphp 2017
Retour AFUP du forumphp 2017
 
OpenStack - open source au service du Cloud
OpenStack - open source au service du CloudOpenStack - open source au service du Cloud
OpenStack - open source au service du Cloud
 
Réactif, parallèle, asynchrone. Pourquoi!
Réactif, parallèle, asynchrone. Pourquoi!Réactif, parallèle, asynchrone. Pourquoi!
Réactif, parallèle, asynchrone. Pourquoi!
 
Java Nio 2
Java Nio 2Java Nio 2
Java Nio 2
 
Intégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec JenkinsIntégration continue des projets PHP avec Jenkins
Intégration continue des projets PHP avec Jenkins
 
Présentation IPV6 ANWARNET 2010
Présentation IPV6 ANWARNET 2010Présentation IPV6 ANWARNET 2010
Présentation IPV6 ANWARNET 2010
 
memoire utilisation de Puppet et Nagios
memoire utilisation de Puppet et Nagiosmemoire utilisation de Puppet et Nagios
memoire utilisation de Puppet et Nagios
 
RSocket un protocole réseau pour les Reactive Streams
RSocket un protocole réseau pour les Reactive StreamsRSocket un protocole réseau pour les Reactive Streams
RSocket un protocole réseau pour les Reactive Streams
 
OpenStack & DevOps, l'Open Source au service du Cloud
OpenStack & DevOps, l'Open Source au service du CloudOpenStack & DevOps, l'Open Source au service du Cloud
OpenStack & DevOps, l'Open Source au service du Cloud
 
Présentation Système d’exploitation Open Source Lepton - MEITO Mai 2014
Présentation Système d’exploitation Open Source Lepton - MEITO Mai 2014Présentation Système d’exploitation Open Source Lepton - MEITO Mai 2014
Présentation Système d’exploitation Open Source Lepton - MEITO Mai 2014
 
[Devoxx] Comment Betclic utilise son datalake pour générer des tests de charg...
[Devoxx] Comment Betclic utilise son datalake pour générer des tests de charg...[Devoxx] Comment Betclic utilise son datalake pour générer des tests de charg...
[Devoxx] Comment Betclic utilise son datalake pour générer des tests de charg...
 

More from SOAT

Back from Microsoft //Build 2018
Back from Microsoft //Build 2018Back from Microsoft //Build 2018
Back from Microsoft //Build 2018SOAT
 
L'entreprise libérée
L'entreprise libéréeL'entreprise libérée
L'entreprise libéréeSOAT
 
Amélioration continue, c'est l'affaire de tous !
Amélioration continue, c'est l'affaire de tous !Amélioration continue, c'est l'affaire de tous !
Amélioration continue, c'est l'affaire de tous !SOAT
 
JAVA 8 : Migration et enjeux stratégiques en entreprise
JAVA 8 : Migration et enjeux stratégiques en entrepriseJAVA 8 : Migration et enjeux stratégiques en entreprise
JAVA 8 : Migration et enjeux stratégiques en entrepriseSOAT
 
ARCHITECTURE MICROSERVICE : TOUR D’HORIZON DU CONCEPT ET BONNES PRATIQUES
ARCHITECTURE MICROSERVICE : TOUR D’HORIZON DU CONCEPT ET BONNES PRATIQUESARCHITECTURE MICROSERVICE : TOUR D’HORIZON DU CONCEPT ET BONNES PRATIQUES
ARCHITECTURE MICROSERVICE : TOUR D’HORIZON DU CONCEPT ET BONNES PRATIQUESSOAT
 
3/3 : The path to CDI 2.0 - Antoine Sabot-Durand
3/3 : The path to CDI 2.0 - Antoine Sabot-Durand3/3 : The path to CDI 2.0 - Antoine Sabot-Durand
3/3 : The path to CDI 2.0 - Antoine Sabot-DurandSOAT
 
1/3 : introduction to CDI - Antoine Sabot-Durand
1/3 : introduction to CDI - Antoine Sabot-Durand1/3 : introduction to CDI - Antoine Sabot-Durand
1/3 : introduction to CDI - Antoine Sabot-DurandSOAT
 
2/3 : CDI advanced - Antoine Sabot-Durand
2/3 : CDI advanced - Antoine Sabot-Durand2/3 : CDI advanced - Antoine Sabot-Durand
2/3 : CDI advanced - Antoine Sabot-DurandSOAT
 
Angular JS - Paterne Gaye-Guingnido
Angular JS - Paterne Gaye-Guingnido Angular JS - Paterne Gaye-Guingnido
Angular JS - Paterne Gaye-Guingnido SOAT
 
Dans l'enfer du Web Mobile - un retour d'expérience - Mathieu Parisot
Dans l'enfer du Web Mobile - un retour d'expérience - Mathieu ParisotDans l'enfer du Web Mobile - un retour d'expérience - Mathieu Parisot
Dans l'enfer du Web Mobile - un retour d'expérience - Mathieu ParisotSOAT
 
RxJava, Getting Started - David Wursteisen - 16 Octobre 2014
RxJava, Getting Started - David Wursteisen - 16 Octobre 2014RxJava, Getting Started - David Wursteisen - 16 Octobre 2014
RxJava, Getting Started - David Wursteisen - 16 Octobre 2014SOAT
 
L'impact du Responsive Web Design sur vos équipes projet - Mathieu Parisot - ...
L'impact du Responsive Web Design sur vos équipes projet - Mathieu Parisot - ...L'impact du Responsive Web Design sur vos équipes projet - Mathieu Parisot - ...
L'impact du Responsive Web Design sur vos équipes projet - Mathieu Parisot - ...SOAT
 
20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soatSOAT
 
Développer des applications iOS et Android avec c# grâce à Xamarin par Cyril ...
Développer des applications iOS et Android avec c# grâce à Xamarin par Cyril ...Développer des applications iOS et Android avec c# grâce à Xamarin par Cyril ...
Développer des applications iOS et Android avec c# grâce à Xamarin par Cyril ...SOAT
 
Amazon Web Service par Bertrand Lehurt - 11 mars 2014
Amazon Web Service par Bertrand Lehurt - 11 mars 2014Amazon Web Service par Bertrand Lehurt - 11 mars 2014
Amazon Web Service par Bertrand Lehurt - 11 mars 2014SOAT
 
ASP.Net Web API - Léonard Labat (18 février 2014)
ASP.Net Web API - Léonard Labat (18 février 2014)ASP.Net Web API - Léonard Labat (18 février 2014)
ASP.Net Web API - Léonard Labat (18 février 2014)SOAT
 
Xamarin et le développement natif d’applications Android, iOS et Windows en C#
 Xamarin et le développement natif d’applications Android, iOS et Windows en C# Xamarin et le développement natif d’applications Android, iOS et Windows en C#
Xamarin et le développement natif d’applications Android, iOS et Windows en C#SOAT
 
A la découverte du Responsive Web Design par Mathieu Parisot - Soat
A la découverte du Responsive Web Design par Mathieu Parisot - SoatA la découverte du Responsive Web Design par Mathieu Parisot - Soat
A la découverte du Responsive Web Design par Mathieu Parisot - SoatSOAT
 
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de donnéesMongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de donnéesSOAT
 
Soirée 3T Soat - Asp.net MVC
Soirée 3T Soat - Asp.net MVCSoirée 3T Soat - Asp.net MVC
Soirée 3T Soat - Asp.net MVCSOAT
 

More from SOAT (20)

Back from Microsoft //Build 2018
Back from Microsoft //Build 2018Back from Microsoft //Build 2018
Back from Microsoft //Build 2018
 
L'entreprise libérée
L'entreprise libéréeL'entreprise libérée
L'entreprise libérée
 
Amélioration continue, c'est l'affaire de tous !
Amélioration continue, c'est l'affaire de tous !Amélioration continue, c'est l'affaire de tous !
Amélioration continue, c'est l'affaire de tous !
 
JAVA 8 : Migration et enjeux stratégiques en entreprise
JAVA 8 : Migration et enjeux stratégiques en entrepriseJAVA 8 : Migration et enjeux stratégiques en entreprise
JAVA 8 : Migration et enjeux stratégiques en entreprise
 
ARCHITECTURE MICROSERVICE : TOUR D’HORIZON DU CONCEPT ET BONNES PRATIQUES
ARCHITECTURE MICROSERVICE : TOUR D’HORIZON DU CONCEPT ET BONNES PRATIQUESARCHITECTURE MICROSERVICE : TOUR D’HORIZON DU CONCEPT ET BONNES PRATIQUES
ARCHITECTURE MICROSERVICE : TOUR D’HORIZON DU CONCEPT ET BONNES PRATIQUES
 
3/3 : The path to CDI 2.0 - Antoine Sabot-Durand
3/3 : The path to CDI 2.0 - Antoine Sabot-Durand3/3 : The path to CDI 2.0 - Antoine Sabot-Durand
3/3 : The path to CDI 2.0 - Antoine Sabot-Durand
 
1/3 : introduction to CDI - Antoine Sabot-Durand
1/3 : introduction to CDI - Antoine Sabot-Durand1/3 : introduction to CDI - Antoine Sabot-Durand
1/3 : introduction to CDI - Antoine Sabot-Durand
 
2/3 : CDI advanced - Antoine Sabot-Durand
2/3 : CDI advanced - Antoine Sabot-Durand2/3 : CDI advanced - Antoine Sabot-Durand
2/3 : CDI advanced - Antoine Sabot-Durand
 
Angular JS - Paterne Gaye-Guingnido
Angular JS - Paterne Gaye-Guingnido Angular JS - Paterne Gaye-Guingnido
Angular JS - Paterne Gaye-Guingnido
 
Dans l'enfer du Web Mobile - un retour d'expérience - Mathieu Parisot
Dans l'enfer du Web Mobile - un retour d'expérience - Mathieu ParisotDans l'enfer du Web Mobile - un retour d'expérience - Mathieu Parisot
Dans l'enfer du Web Mobile - un retour d'expérience - Mathieu Parisot
 
RxJava, Getting Started - David Wursteisen - 16 Octobre 2014
RxJava, Getting Started - David Wursteisen - 16 Octobre 2014RxJava, Getting Started - David Wursteisen - 16 Octobre 2014
RxJava, Getting Started - David Wursteisen - 16 Octobre 2014
 
L'impact du Responsive Web Design sur vos équipes projet - Mathieu Parisot - ...
L'impact du Responsive Web Design sur vos équipes projet - Mathieu Parisot - ...L'impact du Responsive Web Design sur vos équipes projet - Mathieu Parisot - ...
L'impact du Responsive Web Design sur vos équipes projet - Mathieu Parisot - ...
 
20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat20140123 java8 lambdas_jose-paumard-soat
20140123 java8 lambdas_jose-paumard-soat
 
Développer des applications iOS et Android avec c# grâce à Xamarin par Cyril ...
Développer des applications iOS et Android avec c# grâce à Xamarin par Cyril ...Développer des applications iOS et Android avec c# grâce à Xamarin par Cyril ...
Développer des applications iOS et Android avec c# grâce à Xamarin par Cyril ...
 
Amazon Web Service par Bertrand Lehurt - 11 mars 2014
Amazon Web Service par Bertrand Lehurt - 11 mars 2014Amazon Web Service par Bertrand Lehurt - 11 mars 2014
Amazon Web Service par Bertrand Lehurt - 11 mars 2014
 
ASP.Net Web API - Léonard Labat (18 février 2014)
ASP.Net Web API - Léonard Labat (18 février 2014)ASP.Net Web API - Léonard Labat (18 février 2014)
ASP.Net Web API - Léonard Labat (18 février 2014)
 
Xamarin et le développement natif d’applications Android, iOS et Windows en C#
 Xamarin et le développement natif d’applications Android, iOS et Windows en C# Xamarin et le développement natif d’applications Android, iOS et Windows en C#
Xamarin et le développement natif d’applications Android, iOS et Windows en C#
 
A la découverte du Responsive Web Design par Mathieu Parisot - Soat
A la découverte du Responsive Web Design par Mathieu Parisot - SoatA la découverte du Responsive Web Design par Mathieu Parisot - Soat
A la découverte du Responsive Web Design par Mathieu Parisot - Soat
 
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de donnéesMongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
 
Soirée 3T Soat - Asp.net MVC
Soirée 3T Soat - Asp.net MVCSoirée 3T Soat - Asp.net MVC
Soirée 3T Soat - Asp.net MVC
 

Nio sur Netty par Mouhcine Moulou - 3 avril 2014

  • 1. Nio In action Avec Netty 2014-09-10 Nio In Action Avec Netty 1
  • 2. 2014-09-10 Nio In Action Avec Netty 2
  • 3. Agenda ____________ • Oio • Nio • Channel, Buffer & Selector • Zero Copy • DirectBuffer • Netty • Asynchrone & EventDriven • Transport • ChannelHandler • Bootstrap • TestU • Demo 2014-09-10 Nio In Action Avec Netty 3
  • 4. @mouloumouhcine Consultant Java & Scala Mouhcine.moulou@soat.fr 2014-09-10 Nio In Action Avec Netty 4
  • 5. Netty 2014-09-10 Nio In Action Avec Netty 5
  • 6. Références 2014-09-10 Nio In Action Avec Netty 6
  • 7. Références 2014-09-10 Nio In Action Avec Netty 7
  • 8. Un peu d’histoire - Blocking IO depuis la première version Java - Arrivé de Nio à partir de jdk 1.4 - Nio 2 depuis jdk 1.7 2014-09-10 Nio In Action Avec Netty 8
  • 9. Blocking IO - Un Thread par connexion - Appel bloquant - Api bas niveau ( nb de thread Max) () (complexité) 2014-09-10 Nio In Action Avec Netty 9
  • 10. Blocking IO ServerSocket socket = new ServerSocket(port); while (true) { final Socket clientSocket = socket.accept(); new Thread(new Runnable() { public void run() { // TODO } }).start(); } 2014-09-10 Nio In Action Avec Netty 10
  • 11. New (Non Blocking) IO - Utilisation « Propre » des resources. - Un Thread exécute une ou plusieurs Tâches - Les événements IO sont gérés par le « selector » 2014-09-10 Nio In Action Avec Netty 11
  • 12. New (Non Blocking) IO Channel • Similaire au Stream • Lecture & écriture dans le même Channel (Possible en Asynchrone) • Lecture | écriture depuis | dans un Buffer 2014-09-10 Nio In Action Avec Netty 12
  • 13. New (Non Blocking) IO 2014-09-10 Nio In Action Avec Netty 13
  • 14. New (Non Blocking) IO 2014-09-10 Nio In Action Avec Netty 14
  • 15. New (Non Blocking) IO 2014-09-10 Nio In Action Avec Netty 15
  • 16. New (Non Blocking) IO 2014-09-10 Nio In Action Avec Netty 16
  • 17. New (Non Blocking) IO Buffer • Conteneur de données • Lecture & écriture • Propriétés • Position • Limit • capacity 2014-09-10 Nio In Action Avec Netty 17
  • 18. New (Non Blocking) IO Buffer • Conteneur de données • Lecture & écriture • Propriétés • Position • Limit • capacity 2014-09-10 Nio In Action Avec Netty 18
  • 19. Buffer SocketChannel channel = server.accept(); byteBuffer buffer ; channel.read(buffer); // … buffer.flip(); channel.write(buffer); output.compact(); // ou clear() 2014-09-10 Nio In Action Avec Netty 19
  • 20. Buffer ByteBuffer bbuf = ByteBuffer.allocate(10); int capacity = bbuf.capacity(); // 10 bbuf.put(0, (byte)9); // position=0 bbuf.position(5); // relative put() bbuf.put((byte)’a’); int pos = bbuf.position(); // 6 count int rem = bbuf.remaining(); // 4 bbuf.limit(7); // remaining=1 2014-09-10 Nio In Action Avec Netty 20
  • 21. Buffer 2014-09-10 Nio In Action Avec Netty 21
  • 22. New (Non Blocking) IO Selector • Gère le changement d’état d’une ou plusieurs Connexions (Channel) • Un Selector  Un Thread • Un Channel S’enregistre dans un Selector (avec un « interest set ») • OP_READ , OP_WRITE, OP_ACCEPT, OP_CONNECT channel.register(selector, OP_WRITE | OP_READ); 2014-09-10 Nio In Action Avec Netty 22
  • 23. Modèle NiO Thread Selector Channel Channel Channel Buffer 2014-09-10 Nio In Action Avec Netty 23
  • 24. Exemple ServerSocketChannel serverChannel = ServerSocketChannel.open(); ServerSocket ss = serverChannel.socket(); ss.bind(new InetSocketAddress(port)); selector = Selector.open(); serverChannel.register(selector, SelectionKey.OP_ACCEPT); while (true) { selector.select(); Set readyKeys = selector.selectedKeys(); Iterator iterator = readyKeys.iterator(); while (iterator.hasNext()) { } }
  • 25. Nouveautés Nio Zero Copy • Lecture Contenu Statique, puis écriture dans la socket while(inputStream.read(bytes) > 0) { socket.getOutputStream().write(bytes); } 2014-09-10 Nio In Action Avec Netty 25
  • 26. Nouveautés Nio Avant NIO Application Lecture Copie Copie File Copie Read buffer Socket Buffer Context D’application Context Du Kernel Network 2014-09-10 Nio In Action Avec Netty 26
  • 27. Zero Copy Application Copie transferTo(position, count, target) File Read buffer Context D’application Context Du Kernel Socket buffer Network Copie 2014-09-10 Nio In Action Avec Netty 27
  • 28. Nouveautés Nio Direct Buffer • Implémentation ByteBuffer • Mémoire allouée hors Heap Java (Hors mémoire JVM) ByteBuffer buffer = ByteBuffer.allocateDirect(capacity); • Pas de GC (plutôt sun.misc.Cleaner) 2014-09-10 Nio In Action Avec Netty 28
  • 29. Nouveautés Nio Demo Unsafe ? 2014-09-10 Nio In Action Avec Netty 29
  • 30. Nio … Pas si simple o Nio est une Api Complexe o Single Threaded (Selector) o L’implémentation du select() dépend du SE o le « Epoll() bug » o Complexité d’utilisation du Buffer 2014-09-10 Nio In Action Avec Netty 30
  • 31. Netty … à la rescousse 2014-09-10 Nio In Action Avec Netty 31
  • 32. Netty ⦿ Crée par Trustin Lee (RedHat, Twitter à partir de 2011) ⦿ Twitter & RedHat sont les grands contr ⦿ Netty se base sur un Model Asynchrone & EventDriven 2014-09-10 Nio In Action Avec Netty 32
  • 33. Asynchrone … Kesako ⦿ Les opérations I / O ne sont pas bloquantes ⦿ Notification à la fin de l’opération (Callback, Future) ⦿ ChannelFutureListener ⦿ isSuccess() & isError() ⦿add(ChannelFutureListener listener) 2014-09-10 Nio In Action Avec Netty 33
  • 34. Asynchrone …Netty Channel channel = ...; ChannelFuture future = channel.connect(new InetSocketAddress(“192.168.0.1“, 25); future.addListener(new ChannelFutureListener() { public void operationComplete(ChannelFuture future) { if (future.isSuccess()) { // TODO } else { Throwable cause = future.cause(); cause.printStacktrace(); } } }); 2014-09-10 Nio In Action Avec Netty 34
  • 35. Netty … Event Driven ⦿ Netty utilise des événements pour informer l'utilisateur sur des changements d’état. ⦿ Connexion active ⦿ déconnexion ⦿ Écriture & lécture ⦿ Distinction entre les événements entrants et sortants 2014-09-10 Nio In Action Avec Netty 35
  • 36. Transports OIO NIO &( SAOsy_nTcIhMroEOneU?T W) TF Embedded Local Et plus à l’avenir .... 2014-09-10 Nio In Action Avec Netty 36
  • 37. Protocol TCP UDP SCTP UDT 2014-09-10 Nio In Action Avec Netty 37
  • 38. Buffer ⦿ Index lecture & index écriture ⦿ Composite Buffer ⦿ Pooling …! ⦿ Reference Counting 2014-09-10 Nio In Action Avec Netty 38
  • 39. Buffer ⦿ Index lecture & index écriture ⦿ readerIndex & writerIndex Discardable Bytes Readable Bytes Writable Bytes 0 <= readerIndex <= writerIndex <= capacity ⦿ Un Buffer Netty est extensible ⦿ Initialapacity & MaxCapacity 2014-09-10 Nio In Action Avec Netty 39
  • 40. Buffer ByteBuf buffer = ...; while (buffer.readable()) { System.out.println(buffer.readByte()); } Buffer.discardReadBytes(); ByteBuf buffer = ...; while (buffer.writableBytes() >= 4) { buffer.writeInt(random.nextInt()); } 2014-09-10 Nio In Action Avec Netty 40
  • 41. Buffer Allocation ⦿ ByteBufAllocator ⦿ Pooled & Unpooled ⦿ buffer(int) ⦿ buffer(int, int) ⦿ directBuffer() ⦿ directBuffer(int) ⦿ directBuffer(int, int) 2014-09-10 Nio In Action Avec Netty 41
  • 42. Buffer Pooled Buffer ⦿ Depuis Netty 4 ⦿ Moins d’opérations GC à cause d’allocation | désallocation des Buffers ⦿ Utilisation du « jemalloc » ⦿ Meilleur performance dans un environnement « multithreading » 2014-09-10 Nio In Action Avec Netty 42
  • 43. Buffer Reference Counting ⦿ ByteBuf implémente « ReferenceCounted » ⦿ Améliore la gestion d’allocation | désallocation pour le Buffer ByteBuf buf = ctx.alloc().directBuffer(); assert buf.refCnt() == 1; 2014-09-10 Nio In Action Avec Netty 43
  • 44. Buffer Benchmark (netty 3 vs netty 4 avec PooledBuffer) ⦿ EchoServer ⦿ 16000 connexions concurrentes ⦿ Messages 256 bytes en boucle 2014-09-10 Nio In Action Avec Netty 44
  • 45. Buffer 2014-09-10 Nio In Action Avec Netty 45
  • 46. Channel Handler ⦿ Les opérations IO sont gérés par le ChannelHandler ⦿ Découplage du Process Métier ⦿ Type-Safe ⦿ Inbound Handler ⦿ Données reçues ⦿ Outbound Handler ⦿ Données à envoyer 2014-09-10 Nio In Action Avec Netty 46
  • 47. Channel Pipeline 2014-09-10 Nio In Action Avec Netty 47
  • 48. ChannelPipeline ⦿ Implementation par défault : DefaultChannelPipeline ⦿ addFirst(…) ⦿ addBefore(…) ⦿ addAfter(…) ⦿ addLast(…) ⦿ remove(…) ⦿ replace(…) ⦿ iterator() ⦿ LIFO pour les messages entrantes ⦿ FIFO pour les messages sortantes 2014-09-10 Nio In Action Avec Netty 48
  • 49. ChannelPipeline ChannelPipeline pipeline = ..; FirstHandler firstHandler = new FirstHandler(); pipeline.addLast(“handler1“, firstHandler); pipeline.addFirst(“handler2“, new SecondHandler()); pipeline.addLast(“handler3“, new ThirdHandler()); pipeline.remove(“handler3“); pipeline.remove(firstHandler); pipeline.replace(“handler2“, “handler4“, new FourthHandler()); 2014-09-10 Nio In Action Avec Netty 49
  • 50. ChannelInboundHandler ⦿ Traite les données entrantes (données reçues) ⦿ channelRegistered(…) ⦿ channelActive(…) ⦿ channelActive(…) ⦿ channelReadComplete(…) ⦿ channelRead(…) 2014-09-10 Nio In Action Avec Netty 50
  • 51. ChannelInboundHandler 2014-09-10 Nio In Action Avec Netty 51
  • 52. ChannelInboundHandler @Sharable public class FirstHandler extends SimpleChannelInboundHandler { @Override public void channelRead(ChannelHandlerContext ctx, Object msg) { // … } } 2014-09-10 Nio In Action Avec Netty 52
  • 53. ChannelOutboundHandler ⦿ Gère les données & opérations sortantes ⦿ ChannelOutboundHandler ⦿ disconnect(…) ⦿ deregister(…) ⦿ Flush() 2014-09-10 Nio In Action Avec Netty 53
  • 54. Encoder & Decoder ⦿ Encodage & décodage des données envoyées dans le réseau 2014-09-10 Nio In Action Avec Netty 54
  • 55. Decoder ⦿ ByteToMessageDecoder & MessageToMessageDecoder ⦿ Decode() ⦿ decodeLast() ChannelPipeline Inbound ByteBuf Decoder ChannelInboundHandler decode 2014-09-10 Nio In Action Avec Netty 55
  • 56. Codec ⦿ Encodage & décodage dans le même class ⦿ Methodes de l’Encoder & du Decoder ⦿ Decode(), decodeLast(), encode() ⦿ ByteToMessageCodec, MessageToMessageCodec, CombinedChannelDuplexHandler 2014-09-10 Nio In Action Avec Netty 56
  • 57. Decoder @Override public void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { if (in.readableBytes() < 2) { return; } ByteBuf buf = ctx.alloc().buffer(); while (in.readableBytes() >= 2) { char c = in.readChar(); buf.writeChar(Character.toLowerCase(c)); } out.add(buf); } 2014-09-10 Nio In Action Avec Netty 57
  • 58. Implémentations ChannelHandler & Codec HTTP WebSockets Serialization JbossMarshaling Protobuf SSL 2014-09-10 Nio In Action Avec Netty 58
  • 59. UTest ⦿ Possibilité de tester U les channelHandler avec le type de transport « embedded » ⦿ EmbeddedChannel ⦿ Écrire des données entrantes ou sortantes ⦿ Vérifier le bon fonctionnement (Encodage / Decodage) ⦿ writeInbound ⦿ readInbound ⦿ writeOutbound ⦿ readOutbound 2014-09-10 Nio In Action Avec Netty 59
  • 60. Netty … Bootstrap ⦿ configuration des appli Client /serveur Netty ⦿ ServerBootstrap  Server ⦿ Bootstrap  Client 2014-09-10 Nio In Action Avec Netty 60
  • 61. Demo 2014-09-10 Nio In Action Avec Netty 61
  • 62. Conclusion ⦿ Objectifs ⦿ Fonctionnement de base Netty ⦿ Avec Netty, le developpement des applications réseau est beacoup plus simple ⦿ Netty … À l’avenir ⦿ Support Java 8 ⦿ Support Andoird ⦿ Plus de codecs & ChannelHandler ⦿ Contribuez … ! 2014-09-10 Nio In Action Avec Netty 62
  • 63. 2014-09-10 Nio In Action Avec Netty 63
  • 64. 2014-09-10 TEST_Cliquez et modifiez le pied de page 64