贴上两个自己写好的例子,以便备注,以下两个例子基于netty-3.5.7.Final.jar用Junit进行测试
第一个例子:简单的发送字符串,接收字符串“Hello, World”
- packagecom.wujintao.netty;
- importjava.net.InetSocketAddress;
- importjava.util.concurrent.Executors;
- importorg.jboss.netty.bootstrap.ClientBootstrap;
- importorg.jboss.netty.bootstrap.ServerBootstrap;
- importorg.jboss.netty.channel.ChannelFuture;
- importorg.jboss.netty.channel.ChannelHandlerContext;
- importorg.jboss.netty.channel.ChannelPipeline;
- importorg.jboss.netty.channel.ChannelPipelineFactory;
- importorg.jboss.netty.channel.ChannelStateEvent;
- importorg.jboss.netty.channel.Channels;
- importorg.jboss.netty.channel.ExceptionEvent;
- importorg.jboss.netty.channel.MessageEvent;
- importorg.jboss.netty.channel.SimpleChannelHandler;
- importorg.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;
- importorg.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
- importorg.jboss.netty.handler.codec.string.StringDecoder;
- importorg.jboss.netty.handler.codec.string.StringEncoder;
- importorg.junit.Test;
- classHelloWorldServerHandlerextendsSimpleChannelHandler{
- publicvoidchannelConnected(ChannelHandlerContextctx,ChannelStateEvente)
- throwsException{
- e.getChannel().write("Hello,World");
- }
- publicvoidexceptionCaught(ChannelHandlerContextctx,ExceptionEvente){
- System.out.println("Unexpectedexceptionfromdownstream."
- +e.getCause());
- e.getChannel().close();
- }
- }
- classHelloWorldClientHandlerextendsSimpleChannelHandler{
- publicvoidmessageReceived(ChannelHandlerContextctx,MessageEvente){
- Stringmessage=(String)e.getMessage();
- System.out.println(message);
- e.getChannel().close();
- }
- publicvoidexceptionCaught(ChannelHandlerContextctx,ExceptionEvente){
- System.out.println("Unexpectedexceptionfromdownstream."
- +e.getCause());
- e.getChannel().close();
- }
- }
- /**
- *NettyVSMinaNetty基于Pipeline处理,Mina基于Filter过滤
- *Netty的事件驱动模型具有更好的扩展性和易用性
- *Https,SSL,PB,RSTP,Text&Binary等协议支持
- *Netty中UDP传输有更好的支持官方测试Netty比Mina性能更好
- *@authorAdministrator
- *
- */
- publicclassTestCase{
- publicvoidtestServer(){
- //初始化channel的辅助类,为具体子类提供公共数据结构
- ServerBootstrapbootstrap=newServerBootstrap(
- newNioServerSocketChannelFactory(
- Executors.newCachedThreadPool(),
- Executors.newCachedThreadPool()));
- bootstrap.setPipelineFactory(newChannelPipelineFactory(){
- publicChannelPipelinegetPipeline(){
- ChannelPipelinepipeline=Channels.pipeline();
- pipeline.addLast("decoder",newStringDecoder());
- pipeline.addLast("encoder",newStringEncoder());
- pipeline.addLast("handler",newHelloWorldServerHandler());
- returnpipeline;
- }
- });
- //创建服务器端channel的辅助类,接收connection请求
- bootstrap.bind(newInetSocketAddress(8080));
- }
- publicvoidtestClient(){
- //创建客户端channel的辅助类,发起connection请求
- ClientBootstrapbootstrap=newClientBootstrap(
- newNioClientSocketChannelFactory(
- Executors.newCachedThreadPool(),
- Executors.newCachedThreadPool()));
- //ItmeansonesameHelloWorldClientHandlerinstanceisgoingtohandlemultipleChannelsandconsequentlythedatawillbecorrupted.
- //基于上面这个描述,必须用到ChannelPipelineFactory每次创建一个pipeline
- bootstrap.setPipelineFactory(newChannelPipelineFactory(){
- publicChannelPipelinegetPipeline(){
- ChannelPipelinepipeline=Channels.pipeline();
- pipeline.addLast("decoder",newStringDecoder());
- pipeline.addLast("encoder",newStringEncoder());
- pipeline.addLast("handler",newHelloWorldClientHandler());
- returnpipeline;
- }
- });
- //创建无连接传输channel的辅助类(UDP),包括client和server
- ChannelFuturefuture=bootstrap.connect(newInetSocketAddress(
- "localhost",8080));
- future.getChannel().getCloseFuture().awaitUninterruptibly();
- bootstrap.releaseExternalResources();
- }
- @Test
- publicvoidtestNetty(){
- testServer();
- testClient();
- }
- }
第二个例子,实际应用中会用到这个,发送POJO类Persons [name=周杰伦123, age=31, salary=10000.44]
- packagecom.wujintao.netty;
- importstaticorg.jboss.netty.buffer.ChannelBuffers.dynamicBuffer;
- importjava.net.InetSocketAddress;
- importjava.util.concurrent.Executors;
- importorg.jboss.netty.bootstrap.ClientBootstrap;
- importorg.jboss.netty.bootstrap.ServerBootstrap;
- importorg.jboss.netty.buffer.ChannelBuffer;
- importorg.jboss.netty.channel.Channel;
- importorg.jboss.netty.channel.ChannelFactory;
- importorg.jboss.netty.channel.ChannelFuture;
- importorg.jboss.netty.channel.ChannelFutureListener;
- importorg.jboss.netty.channel.ChannelHandlerContext;
- importorg.jboss.netty.channel.ChannelPipeline;
- importorg.jboss.netty.channel.ChannelPipelineFactory;
- importorg.jboss.netty.channel.ChannelStateEvent;
- importorg.jboss.netty.channel.Channels;
- importorg.jboss.netty.channel.MessageEvent;
- importorg.jboss.netty.channel.SimpleChannelHandler;
- importorg.jboss.netty.channel.socket.nio.NioClientSocketChannelFactory;
- importorg.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory;
- importorg.jboss.netty.handler.codec.frame.FrameDecoder;
- importorg.junit.Test;
- /**
- *用POJO代替ChannelBuffer
- */
- classTimeServerHandler3extendsSimpleChannelHandler{
- @Override
- publicvoidchannelConnected(ChannelHandlerContextctx,ChannelStateEvente)
- throwsException{
- Personsperson=newPersons("周杰伦123",31,10000.44);
- ChannelFuturefuture=e.getChannel().write(person);
- future.addListener(ChannelFutureListener.CLOSE);
- }
- }
- classTimeClientHandler3extendsSimpleChannelHandler{
- @Override
- publicvoidmessageReceived(ChannelHandlerContextctx,MessageEvente)
- throwsException{
- Personsperson=(Persons)e.getMessage();
- System.out.println(person);
- e.getChannel().close();
- }
- }
- /**
- *FrameDecoderandReplayingDecoderallowyoutoreturnanobjectofanytype.
- *
- */
- classTimeDecoderextendsFrameDecoder{
- privatefinalChannelBufferbuffer=dynamicBuffer();
- @Override
- protectedObjectdecode(ChannelHandlerContextctx,Channelchannel,
- ChannelBufferchannelBuffer)throwsException{
- if(channelBuffer.readableBytes()<4){
- returnnull;
- }
- if(channelBuffer.readable()){
- //读到,并写入buf
- channelBuffer.readBytes(buffer,channelBuffer.readableBytes());
- }
- intnamelength=buffer.readInt();
- Stringname=newString(buffer.readBytes(namelength).array(),"GBK");
- intage=buffer.readInt();
- doublesalary=buffer.readDouble();
- Personsperson=newPersons(name,age,salary);
- returnperson;
- }
- }
- classTimeEncoderextendsSimpleChannelHandler{
- privatefinalChannelBufferbuffer=dynamicBuffer();
- @Override
- publicvoidwriteRequested(ChannelHandlerContextctx,MessageEvente)
- throwsException{
- Personsperson=(Persons)e.getMessage();
- buffer.writeInt(person.getName().getBytes("GBK").length);
- buffer.writeBytes(person.getName().getBytes("GBK"));
- buffer.writeInt(person.getAge());
- buffer.writeDouble(person.getSalary());
- Channels.write(ctx,e.getFuture(),buffer);
- }
- }
- classPersons{
- privateStringname;
- privateintage;
- privatedoublesalary;
- publicPersons(Stringname,intage,doublesalary){
- this.name=name;
- this.age=age;
- this.salary=salary;
- }
- publicStringgetName(){
- returnname;
- }
- publicvoidsetName(Stringname){
- this.name=name;
- }
- publicintgetAge(){
- returnage;
- }
- publicvoidsetAge(intage){
- this.age=age;
- }
- publicdoublegetSalary(){
- returnsalary;
- }
- publicvoidsetSalary(doublesalary){
- this.salary=salary;
- }
- @Override
- publicStringtoString(){
- return"Persons[name="+name+",age="+age+",salary="+salary
- +"]";
- }
- }
- publicclassTestCase5{
- publicvoidtestServer(){
- ChannelFactoryfactory=newNioServerSocketChannelFactory(Executors.newCachedThreadPool(),Executors.newCachedThreadPool());
- ServerBootstrapbootstrap=newServerBootstrap(factory);
- bootstrap.setPipelineFactory(newChannelPipelineFactory(){
- publicChannelPipelinegetPipeline()throwsException{
- returnChannels.pipeline(newTimeEncoder(),newTimeServerHandler3());
- }
- });
- bootstrap.setOption("child.tcpNoDelay",true);
- bootstrap.setOption("child.keepAlive",true);
- bootstrap.bind(newInetSocketAddress("localhost",9999));
- }
- publicvoidtestClient(){
- //创建客户端channel的辅助类,发起connection请求
- ClientBootstrapbootstrap=newClientBootstrap(
- newNioClientSocketChannelFactory(
- Executors.newCachedThreadPool(),
- Executors.newCachedThreadPool()));
- bootstrap.setPipelineFactory(newChannelPipelineFactory(){
- publicChannelPipelinegetPipeline(){
- ChannelPipelinepipeline=Channels.pipeline();
- pipeline.addLast("decoder",newTimeDecoder());
- pipeline.addLast("encoder",newTimeEncoder());
- pipeline.addLast("handler",newTimeClientHandler3());
- returnpipeline;
- }
- });
- //创建无连接传输channel的辅助类(UDP),包括client和server
- ChannelFuturefuture=bootstrap.connect(newInetSocketAddress(
- "localhost",9999));
- future.getChannel().getCloseFuture().awaitUninterruptibly();
- bootstrap.releaseExternalResources();
- }
- @Test
- publicvoidtestNetty(){
- testServer();
- testClient();
- }
- }