以下两个例子基于netty-3.5.7.Final.jar用Junit进行测试
第一个例子:简单的发送字符串,接收字符串“Hello, World”
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 |
class HelloWorldServerHandler extends SimpleChannelHandler { public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { e.getChannel().write("Hello, World"); } public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) { System.out.println("Unexpected exception from downstream." + e.getCause()); e.getChannel().close(); } } class HelloWorldClientHandler extends SimpleChannelHandler { public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) { String message = (String) e.getMessage(); System.out.println(message); e.getChannel().close(); } public void exceptionCaught(ChannelHandlerContext ctx, ExceptionEvent e) { System.out.println("Unexpected exception from downstream." + e.getCause()); e.getChannel().close(); } } /** * Netty VS MinaNetty基于Pipeline处理,Mina基于Filter过滤 * Netty的事件驱动模型具有更好的扩展性和易用性 * Https,SSL,PB,RSTP,Text &Binary等协议支持 * Netty中UDP传输有更好的支持官方测试Netty比Mina性能更好 * @author Administrator * */ public class TestCase { public void testServer() { //初始化channel的辅助类,为具体子类提供公共数据结构 ServerBootstrap bootstrap = new ServerBootstrap( new NioServerSocketChannelFactory( Executors.newCachedThreadPool(), Executors.newCachedThreadPool())); bootstrap.setPipelineFactory(new ChannelPipelineFactory() { public ChannelPipeline getPipeline() { ChannelPipeline pipeline = Channels.pipeline(); pipeline.addLast("decoder", new StringDecoder()); pipeline.addLast("encoder", new StringEncoder()); pipeline.addLast("handler", new HelloWorldServerHandler()); return pipeline; } }); //创建服务器端channel的辅助类,接收connection请求 bootstrap.bind(new InetSocketAddress(8080)); } public void testClient() { //创建客户端channel的辅助类,发起connection请求 ClientBootstrap bootstrap = new ClientBootstrap( new NioClientSocketChannelFactory( Executors.newCachedThreadPool(), Executors.newCachedThreadPool())); //It means one same HelloWorldClientHandler instance is going to handle multiple Channels and consequently the data will be corrupted. //基于上面这个描述,必须用到ChannelPipelineFactory每次创建一个pipeline bootstrap.setPipelineFactory(new ChannelPipelineFactory() { public ChannelPipeline getPipeline() { ChannelPipeline pipeline = Channels.pipeline(); pipeline.addLast("decoder", new StringDecoder()); pipeline.addLast("encoder", new StringEncoder()); pipeline.addLast("handler", new HelloWorldClientHandler()); return pipeline; } }); //创建无连接传输channel的辅助类(UDP),包括client和server ChannelFuture future = bootstrap.connect(new InetSocketAddress( "localhost", 8080)); future.getChannel().getCloseFuture().awaitUninterruptibly(); bootstrap.releaseExternalResources(); } @Test public void testNetty(){ testServer(); testClient(); } } |
第二个例子,实际应用中会用到这个,发送POJO类Persons [name=周杰伦123, age=31, salary=10000.44]
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 |
/** * 用POJO代替ChannelBuffer */ class TimeServerHandler3 extends SimpleChannelHandler { @Override public void channelConnected(ChannelHandlerContext ctx, ChannelStateEvent e) throws Exception { Persons person = new Persons("周杰伦123",31,10000.44); ChannelFuture future = e.getChannel().write(person); future.addListener(ChannelFutureListener.CLOSE); } } class TimeClientHandler3 extends SimpleChannelHandler{ @Override public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { Persons person = (Persons)e.getMessage(); System.out.println(person); e.getChannel().close(); } } /** * FrameDecoder and ReplayingDecoder allow you to return an object of any type. * */ class TimeDecoder extends FrameDecoder { private final ChannelBuffer buffer = dynamicBuffer(); @Override protected Object decode(ChannelHandlerContext ctx, Channel channel, ChannelBuffer channelBuffer) throws Exception { if(channelBuffer.readableBytes()<4) { return null; } if (channelBuffer.readable()) { // 读到,并写入buf channelBuffer.readBytes(buffer, channelBuffer.readableBytes()); } int namelength = buffer.readInt(); String name = new String(buffer.readBytes(namelength).array(),"GBK"); int age = buffer.readInt(); double salary = buffer.readDouble(); Persons person = new Persons(name,age,salary); return person; } } class TimeEncoder extends SimpleChannelHandler { private final ChannelBuffer buffer = dynamicBuffer(); @Override public void writeRequested(ChannelHandlerContext ctx, MessageEvent e) throws Exception { Persons person = (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); } } class Persons{ private String name; private int age; private double salary; public Persons(String name,int age,double salary){ this.name = name; this.age = age; this.salary = salary; } public String getName() { return name; } public void setName(String name) { this.name = name; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public double getSalary() { return salary; } public void setSalary(double salary) { this.salary = salary; } @Override public String toString() { return "Persons [name=" + name + ", age=" + age + ", salary=" + salary + "]"; } } public class TestCase5 { public void testServer() { ChannelFactory factory = new NioServerSocketChannelFactory(Executors.newCachedThreadPool(), Executors.newCachedThreadPool()); ServerBootstrap bootstrap = new ServerBootstrap(factory); bootstrap.setPipelineFactory(new ChannelPipelineFactory() { public ChannelPipeline getPipeline() throws Exception { return Channels.pipeline(new TimeEncoder(), new TimeServerHandler3()); } }); bootstrap.setOption("child.tcpNoDelay", true); bootstrap.setOption("child.keepAlive", true); bootstrap.bind(new InetSocketAddress("localhost",9999)); } public void testClient(){ //创建客户端channel的辅助类,发起connection请求 ClientBootstrap bootstrap = new ClientBootstrap( new NioClientSocketChannelFactory( Executors.newCachedThreadPool(), Executors.newCachedThreadPool())); bootstrap.setPipelineFactory(new ChannelPipelineFactory() { public ChannelPipeline getPipeline() { ChannelPipeline pipeline = Channels.pipeline(); pipeline.addLast("decoder", new TimeDecoder()); pipeline.addLast("encoder", new TimeEncoder()); pipeline.addLast("handler", new TimeClientHandler3()); return pipeline; } }); //创建无连接传输channel的辅助类(UDP),包括client和server ChannelFuture future = bootstrap.connect(new InetSocketAddress( "localhost", 9999)); future.getChannel().getCloseFuture().awaitUninterruptibly(); bootstrap.releaseExternalResources(); } @Test public void testNetty() { testServer(); testClient(); } } |
这两段代码是学习的时候参考别人的代码,转于哪想不起来了,但是这两段代码让我了解了netty的通信流程。
©原创文章,转载请注明来源: 赵伊凡's Blog
©本文链接地址: Netty学习(2)——Netty使用实例
“Netty学习(2)——Netty使用实例”的33个回复