zoukankan      html  css  js  c++  java
  • Netty消息传递

    知识点

    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
        public void 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
        public void messageReceived(ChannelHandlerContext ctx, MessageEvent e) throws Exception {
    
            String message = (String)e.getMessage();
            
            System.out.println("handler2:" + message);
        }
    }

    完毕!

  • 相关阅读:
    算法----(1)冒泡排序
    淘宝爬虫
    爬虫_豆瓣电影top250 (正则表达式)
    爬虫_猫眼电影top100(正则表达式)
    Android 简单调用摄像头
    Android 简单天气预报
    思维模型
    This view is not constrained, it only has designtime positions, so it will jump to (0,0) unless you
    Android studio preview界面无法预览,报错render problem
    Android studio 3.1.2报错,no target device found
  • 原文地址:https://www.cnblogs.com/ywjfx/p/12812907.html
Copyright © 2011-2022 走看看