Netty使用实例

来源:互联网 发布:unity3d 模型加载 编辑:程序博客网 时间:2024/06/06 08:44


贴上两个自己写好的例子,以便备注,以下两个例子基于netty-3.5.7.Final.jar用Junit进行测试

 

第一个例子:简单的发送字符串,接收字符串“Hello, World”

 

Java代码  收藏代码
  1. package com.wujintao.netty;  
  2.   
  3. import java.net.InetSocketAddress;  
  4. import java.util.concurrent.Executors;  
  5.   
  6. import org.jboss.netty.bootstrap.ClientBootstrap;  
  7. import org.jboss.netty.bootstrap.ServerBootstrap;  
  8. import org.jboss.netty.channel.ChannelFuture;  
  9. import org.jboss.netty.channel.ChannelHandlerContext;  
  10. import org.jboss.netty.channel.ChannelPipeline;  
  11. import org.jboss.netty.channel.ChannelPipelineFactory;  
  12. import org.jboss.netty.channel.ChannelStateEvent;  
  13. import org.jboss.netty.channel.Channels;  
  14. import org.jboss.netty.channel.ExceptionEvent;  
  15. import org.jboss.netty.channel.MessageEvent;  
  16. import org.jboss.netty.channel.SimpleChannelHandler;  
  17. import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;  
  18. import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;  
  19. import org.jboss.netty.handler.codec.string.StringDecoder;  
  20. import org.jboss.netty.handler.codec.string.StringEncoder;  
  21. import org.junit.Test;  
  22.   
  23. class HelloWorldServerHandler extends SimpleChannelHandler {  
  24.     public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)  
  25.             throws Exception {  
  26.         e.getChannel().write("Hello, World");  
  27.     }  
  28.   
  29.     public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {  
  30.         System.out.println("Unexpected exception from downstream."  
  31.                 + e.getCause());  
  32.         e.getChannel().close();  
  33.     }  
  34. }  
  35.   
  36. class HelloWorldClientHandler extends SimpleChannelHandler {  
  37.   
  38.     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) {  
  39.         String message = (String) e.getMessage();  
  40.         System.out.println(message);  
  41.         e.getChannel().close();  
  42.     }  
  43.   
  44.     public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) {  
  45.         System.out.println("Unexpected exception from downstream."  
  46.                 + e.getCause());  
  47.         e.getChannel().close();  
  48.     }  
  49. }  
  50.   
  51.   
  52. /** 
  53.  * Netty VS MinaNetty基于Pipeline处理,Mina基于Filter过滤 
  54.  * Netty的事件驱动模型具有更好的扩展性和易用性 
  55.  * Https,SSL,PB,RSTP,Text &Binary等协议支持 
  56.  * Netty中UDP传输有更好的支持官方测试Netty比Mina性能更好 
  57.  * @author Administrator 
  58.  * 
  59.  */  
  60. public class TestCase {  
  61.   
  62.     public void testServer() {  
  63.         //初始化channel的辅助类,为具体子类提供公共数据结构  
  64.         ServerBootstrap bootstrap = new ServerBootstrap(  
  65.                 new NioServerSocketChannelFactory(  
  66.                         Executors.newCachedThreadPool(),  
  67.                         Executors.newCachedThreadPool()));  
  68.         bootstrap.setPipelineFactory(new ChannelPipelineFactory() {  
  69.             public ChannelPipeline getPipeline() {  
  70.                 ChannelPipeline pipeline = Channels.pipeline();  
  71.                 pipeline.addLast("decoder"new StringDecoder());  
  72.                 pipeline.addLast("encoder"new StringEncoder());  
  73.                 pipeline.addLast("handler"new HelloWorldServerHandler());  
  74.                 return pipeline;  
  75.             }  
  76.         });  
  77.         //创建服务器端channel的辅助类,接收connection请求  
  78.         bootstrap.bind(new InetSocketAddress(8080));  
  79.     }  
  80.       
  81.       
  82.       
  83.     public void testClient() {  
  84.         //创建客户端channel的辅助类,发起connection请求   
  85.         ClientBootstrap bootstrap = new ClientBootstrap(  
  86.                 new NioClientSocketChannelFactory(  
  87.                         Executors.newCachedThreadPool(),  
  88.                         Executors.newCachedThreadPool()));  
  89.         //It means one same HelloWorldClientHandler instance is going to handle multiple Channels and consequently the data will be corrupted.  
  90.         //基于上面这个描述,必须用到ChannelPipelineFactory每次创建一个pipeline  
  91.         bootstrap.setPipelineFactory(new ChannelPipelineFactory() {  
  92.             public ChannelPipeline getPipeline() {  
  93.                 ChannelPipeline pipeline =  Channels.pipeline();  
  94.                 pipeline.addLast("decoder"new StringDecoder());  
  95.                 pipeline.addLast("encoder"new StringEncoder());  
  96.                 pipeline.addLast("handler"new HelloWorldClientHandler());  
  97.                 return pipeline;  
  98.             }  
  99.         });  
  100.         //创建无连接传输channel的辅助类(UDP),包括client和server  
  101.         ChannelFuture future = bootstrap.connect(new InetSocketAddress(  
  102.                 "localhost"8080));  
  103.         future.getChannel().getCloseFuture().awaitUninterruptibly();  
  104.         bootstrap.releaseExternalResources();  
  105.     }  
  106.       
  107.       
  108.     @Test  
  109.     public void testNetty(){  
  110.         testServer();  
  111.         testClient();  
  112.     }  
  113.   
  114. }  

 

第二个例子,实际应用中会用到这个,发送POJO类Persons [name=周杰伦123, age=31, salary=10000.44]

Java代码  收藏代码
  1. package com.wujintao.netty;  
  2.   
  3. import static org.jboss.netty.buffer.ChannelBuffers.dynamicBuffer;  
  4.   
  5. import java.net.InetSocketAddress;  
  6. import java.util.concurrent.Executors;  
  7.   
  8. import org.jboss.netty.bootstrap.ClientBootstrap;  
  9. import org.jboss.netty.bootstrap.ServerBootstrap;  
  10. import org.jboss.netty.buffer.ChannelBuffer;  
  11. import org.jboss.netty.channel.Channel;  
  12. import org.jboss.netty.channel.ChannelFactory;  
  13. import org.jboss.netty.channel.ChannelFuture;  
  14. import org.jboss.netty.channel.ChannelFutureListener;  
  15. import org.jboss.netty.channel.ChannelHandlerContext;  
  16. import org.jboss.netty.channel.ChannelPipeline;  
  17. import org.jboss.netty.channel.ChannelPipelineFactory;  
  18. import org.jboss.netty.channel.ChannelStateEvent;  
  19. import org.jboss.netty.channel.Channels;  
  20. import org.jboss.netty.channel.MessageEvent;  
  21. import org.jboss.netty.channel.SimpleChannelHandler;  
  22. import org.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;  
  23. import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;  
  24. import org.jboss.netty.handler.codec.frame.FrameDecoder;  
  25. import org.junit.Test;  
  26.   
  27. /** 
  28.  * 用POJO代替ChannelBuffer 
  29.  */  
  30.   
  31. class TimeServerHandler3 extends SimpleChannelHandler {    
  32.         
  33.     @Override    
  34.     public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e)    
  35.             throws Exception {    
  36.         Persons person = new Persons("周杰伦123",31,10000.44);  
  37.         ChannelFuture future = e.getChannel().write(person);    
  38.         future.addListener(ChannelFutureListener.CLOSE);    
  39.     }    
  40. }    
  41.   
  42. class TimeClientHandler3 extends SimpleChannelHandler{    
  43.         
  44.     @Override    
  45.     public void messageReceived(ChannelHandlerContext ctx, MessageEvent e)    
  46.             throws Exception {    
  47.         Persons person = (Persons)e.getMessage();    
  48.         System.out.println(person);    
  49.         e.getChannel().close();    
  50.     }    
  51. }  
  52.   
  53. /** 
  54.  * FrameDecoder and ReplayingDecoder allow you to return an object of any type. 
  55.  *  
  56.  */  
  57. class TimeDecoder extends FrameDecoder {    
  58.     private final ChannelBuffer buffer = dynamicBuffer();  
  59.         
  60.     @Override    
  61.     protected Object decode(ChannelHandlerContext ctx, Channel channel,    
  62.             ChannelBuffer channelBuffer) throws Exception {    
  63.         if(channelBuffer.readableBytes()<4) {    
  64.             return null;    
  65.         }    
  66.         if (channelBuffer.readable()) {  
  67.             // 读到,并写入buf  
  68.             channelBuffer.readBytes(buffer, channelBuffer.readableBytes());  
  69.         }  
  70.         int namelength = buffer.readInt();  
  71.         String name = new String(buffer.readBytes(namelength).array(),"GBK");  
  72.         int age = buffer.readInt();  
  73.         double salary = buffer.readDouble();  
  74.         Persons person = new Persons(name,age,salary);  
  75.         return person;    
  76.     }    
  77.     
  78. }    
  79.   
  80. class TimeEncoder extends SimpleChannelHandler {    
  81.     private final ChannelBuffer buffer = dynamicBuffer();  
  82.       
  83.     @Override    
  84.     public void writeRequested(ChannelHandlerContext ctx, MessageEvent e)    
  85.             throws Exception {    
  86.         Persons person = (Persons)e.getMessage();    
  87.         buffer.writeInt(person.getName().getBytes("GBK").length);  
  88.         buffer.writeBytes(person.getName().getBytes("GBK"));  
  89.         buffer.writeInt(person.getAge());  
  90.         buffer.writeDouble(person.getSalary());  
  91.         Channels.write(ctx, e.getFuture(), buffer);    
  92.     }    
  93. }  
  94.   
  95. class Persons{  
  96.     private String name;  
  97.     private int age;  
  98.     private double salary;  
  99.       
  100.     public Persons(String name,int age,double salary){  
  101.         this.name = name;  
  102.         this.age = age;  
  103.         this.salary = salary;  
  104.     }  
  105.       
  106.     public String getName() {  
  107.         return name;  
  108.     }  
  109.     public void setName(String name) {  
  110.         this.name = name;  
  111.     }  
  112.     public int getAge() {  
  113.         return age;  
  114.     }  
  115.     public void setAge(int age) {  
  116.         this.age = age;  
  117.     }  
  118.     public double getSalary() {  
  119.         return salary;  
  120.     }  
  121.     public void setSalary(double salary) {  
  122.         this.salary = salary;  
  123.     }  
  124.   
  125.     @Override  
  126.     public String toString() {  
  127.         return "Persons [name=" + name + ", age=" + age + ", salary=" + salary  
  128.                 + "]";  
  129.     }  
  130.       
  131.       
  132. }  
  133.   
  134. public class TestCase5 {  
  135.     public void testServer() {  
  136.           ChannelFactory factory = new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool());    
  137.             ServerBootstrap bootstrap = new ServerBootstrap(factory);    
  138.             bootstrap.setPipelineFactory(new ChannelPipelineFactory() {    
  139.                     
  140.                 public ChannelPipeline getPipeline() throws Exception {    
  141.                     return Channels.pipeline(new TimeEncoder(), new TimeServerHandler3());    
  142.                 }    
  143.             });    
  144.             bootstrap.setOption("child.tcpNoDelay"true);    
  145.             bootstrap.setOption("child.keepAlive"true);    
  146.                 
  147.             bootstrap.bind(new InetSocketAddress("localhost",9999));   
  148.     }  
  149.       
  150.     public void testClient(){  
  151.         //创建客户端channel的辅助类,发起connection请求   
  152.         ClientBootstrap bootstrap = new ClientBootstrap(  
  153.                 new NioClientSocketChannelFactory(  
  154.                         Executors.newCachedThreadPool(),  
  155.                         Executors.newCachedThreadPool()));  
  156.         bootstrap.setPipelineFactory(new ChannelPipelineFactory() {  
  157.             public ChannelPipeline getPipeline() {  
  158.                 ChannelPipeline pipeline =  Channels.pipeline();  
  159.                 pipeline.addLast("decoder"new TimeDecoder());  
  160.                 pipeline.addLast("encoder"new TimeEncoder());  
  161.                 pipeline.addLast("handler"new TimeClientHandler3());  
  162.                 return pipeline;  
  163.             }  
  164.         });  
  165.         //创建无连接传输channel的辅助类(UDP),包括client和server  
  166.         ChannelFuture future = bootstrap.connect(new InetSocketAddress(  
  167.                 "localhost"9999));  
  168.         future.getChannel().getCloseFuture().awaitUninterruptibly();  
  169.         bootstrap.releaseExternalResources();  
  170.     }  
  171.   
  172.     @Test  
  173.     public void testNetty() {  
  174.             testServer();  
  175.             testClient();  
  176.     }  
  177. }  
 
0 0
原创粉丝点击