Netty消息传递
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Netty消息传递,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含3281字,纯文字阅读大概需要5分钟。
内容图文
知识点
1、消息如何在管道中流转 ,一个管道中会有多个handler,当前的一个handler如何往下面的一个handler传递一个对象 主要通过handler往下传递对象的方法是sendUpstream(event) 2、看下粘包和分包是怎么样一个情况 hello hello 通过定义一个稳定的结构 length + hello 1、为什么FrameDecoder return的对象就是往下传递的对象 (还是调用了sendUpstream) 2、buffer里面数据未被读取完怎么办? (cumulation缓存) 3、为什么return null就可以缓存buffer (cumulation缓存) =============================分割线=========================== 3、FrameDecoder里面的cumulation其实就是一个缓存的buffer对象 包头+长度+数据 把长度定义的很大,这种数据包,通常被称为socket攻击,字节流式攻击
1、Client.java
package com.example.netty.lesson11.pipeLine; import java.net.Socket; public class Client { public static void main(String[] args) throws Exception { Socket socket = new Socket("127.0.0.1", 51503); socket.getOutputStream().write("hello".getBytes()); socket.close(); } }
2、Server.java
package com.example.netty.lesson11.pipeLine; import java.net.InetSocketAddress; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; import org.jboss.netty.bootstrap.ServerBootstrap; import org.jboss.netty.channel.ChannelPipeline; import org.jboss.netty.channel.ChannelPipelineFactory; import org.jboss.netty.channel.Channels; import org.jboss.netty.channel.socket.nio.NioServerSocketChannelFactory; /** * 消息传递 */ public class Server { public static void main(String[] args) { // 服务类 ServerBootstrap bootstrap = new ServerBootstrap(); //boss线程监听端口,worker线程负责数据读写 ExecutorService boss = Executors.newCachedThreadPool(); ExecutorService worker = Executors.newCachedThreadPool(); //设置niosocket工厂 bootstrap.setFactory(new NioServerSocketChannelFactory(boss, worker)); //设置管道的工厂 bootstrap.setPipelineFactory(new ChannelPipelineFactory() { @Override public ChannelPipeline getPipeline() throws Exception { ChannelPipeline pipeline = Channels.pipeline(); pipeline.addLast("handler1", new MyHandler1()); pipeline.addLast("handler2", new MyHandler2()); return pipeline; } }); bootstrap.bind(new InetSocketAddress(51503)); System.out.println("start!!!"); } }
3、MyHandler1.java
package com.example.netty.lesson11.pipeLine; import org.jboss.netty.buffer.ChannelBuffer; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.channel.SimpleChannelHandler; import org.jboss.netty.channel.UpstreamMessageEvent; public class MyHandler1 extends SimpleChannelHandler { @Override publicvoid messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { ChannelBuffer buffer = (ChannelBuffer)e.getMessage(); byte[] array = buffer.array(); String message = new String(array); System.out.println("handler1:" + message); //传递给handler2 ctx.sendUpstream(new UpstreamMessageEvent(ctx.getChannel(), "abc", e.getRemoteAddress())); ctx.sendUpstream(new UpstreamMessageEvent(ctx.getChannel(), "efg", e.getRemoteAddress())); } }
4、MyHandler2.java
package com.example.netty.lesson11.pipeLine; import org.jboss.netty.channel.ChannelHandlerContext; import org.jboss.netty.channel.MessageEvent; import org.jboss.netty.channel.SimpleChannelHandler; public class MyHandler2 extends SimpleChannelHandler { @Override publicvoid messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception { String message = (String)e.getMessage(); System.out.println("handler2:" + message); } }
完毕!
原文:https://www.cnblogs.com/ywjfx/p/12812907.html
内容总结
以上是互联网集市为您收集整理的Netty消息传递全部内容,希望文章能够帮你解决Netty消息传递所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。