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);
        }
    }

    完毕!

  • 相关阅读:
    【unity3d游戏开发之基础篇】unity3d射线的原理用法以及一个利用射线实现简单拾取的小例子
    【unity3d游戏开发之疑难杂症】Unity3d工程如何与MonoDevelop工具进行调试
    【unity3d游戏开发之疑难杂症】解决Unity3d脚本支持中文问题
    cocos2d 中添加显示文字的三种方式(CCLabelTTF 、CCLabelBMFont 和CCLabelAtlas)
    xcode连不上ipad的原因
    【unity3d游戏开发之疑难杂症】Error while importing package: Couldn't decompress package
    AS3 event flow 事件冒泡机制 以及 stopImmediatePropagation() stopPropagation()用法
    【unity3d游戏开发之基础篇】利用射线实现鼠标控制角色转向和移动(角色移动一)
    Asp.net Session认识加强Session究竟是如何存储你知道吗?
    Windows 7下VS2008无法调试2.0.50727.4952版本mscorlib.dll的解决办法
  • 原文地址:https://www.cnblogs.com/ywjfx/p/12812907.html
Copyright © 2011-2022 走看看