`
iaiai
  • 浏览: 2195399 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Netty4转发服务的实现方案

    博客分类:
  • J2EE
 
阅读更多
如果用Netty做转发服务(不需要同步应答),Netty中有一种特殊的模式来满足这个需求。

其原理是在Handler中再启用新的Bootstrap,这个新的Bootstrap和外层的Bootstrap可以共享同一个Channel,

新的Bootstrap为客户端模式,连接到转发目标服务地址,具体实现如下:
import java.net.InetSocketAddress;
 
import io.netty.bootstrap.Bootstrap;
import io.netty.bootstrap.ServerBootstrap;
import io.netty.buffer.ByteBuf;
import io.netty.channel.Channel;
import io.netty.channel.ChannelFuture;
import io.netty.channel.ChannelFutureListener;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.channel.socket.nio.NioSocketChannel;
import io.netty.handler.codec.string.StringDecoder;
import io.netty.handler.codec.string.StringEncoder;
 
public class Aaa {
    public static void main(String[] params) {
        ServerBootstrap bootstrap = new ServerBootstrap();
        bootstrap.group(new NioEventLoopGroup(), new NioEventLoopGroup())
            .channel(NioServerSocketChannel.class)
            .childHandler(new ChannelInitializer<Channel>() {
                @Override
                protected void initChannel(Channel ch) throws Exception {
                    // TODO Auto-generated method stub
                    ch.pipeline().addLast(new StringDecoder()); 
                    ch.pipeline().addLast(new StringEncoder());
                    ch.pipeline().addLast(new SimpleChannelInboundHandler<String>() {
                        private ChannelHandlerContext innerCtx;
                        ChannelFuture connectFuture;
                        @Override
                        public void channelActive(ChannelHandlerContext ctx)
                                throws Exception {
                            Bootstrap bootstrap = new Bootstrap();
                            bootstrap.channel(NioSocketChannel.class).handler(
                                new SimpleChannelInboundHandler<ByteBuf>() {
                                    //内层建立的连接,从这里接收内层的应答,在这里是服务端的应答
                                    @Override
                                    protected void channelRead0(
                                        ChannelHandlerContext ctx, ByteBuf in)
                                        throws Exception {
                                        innerCtx = ctx;
                                        
                                        byte[] dst = new byte[in.readableBytes()];
                                        in.readBytes(dst);
                                        
                                        System.out.println("Received data" + new String(dst));
                                    }
                                    
                                    @Override
                                    public void channelActive(ChannelHandlerContext ctx) throws Exception {
                                        System.out.println("链接服务"+ctx.channel().toString());
                                    }
                                } );
                            bootstrap.group(ctx.channel().eventLoop());//关键在这里。把外层channel的eventLoop挂接在内层上
                            connectFuture = bootstrap.connect(
//                                new InetSocketAddress("192.168.60.49", 23456));
                                    new InetSocketAddress("localhost", 23456));
                        }
 
                        @Override
                        protected void channelRead0(ChannelHandlerContext ctx, String msg) throws Exception {
                            // TODO Auto-generated method stub
                            if (connectFuture.isDone()) {
                                // do something with the data
                                //channel并不共享,共享的是线程EventLoop,所以如果想向内层转发的话
                                //需要持有内层的channel
 
                                if (innerCtx != null && innerCtx.channel().isActive()) {
                                    innerCtx.writeAndFlush(msg);
                                }
                            }
                        }
                    });
                    ChannelFuture future = bootstrap.bind(new InetSocketAddress(8080));
                    future.addListener(new ChannelFutureListener() {
                        @Override
                        public void operationComplete(ChannelFuture channelFuture)
                                throws Exception {
                            if (channelFuture.isSuccess()) {
                                System.out.println("Server bound 8080");
                            } else {
                                System.err.println("Bind attempt failed");
                                channelFuture.cause().printStackTrace();
                            }
                        } 
                    });
                }
            });
    }
}
分享到:
评论

相关推荐

    netty+4G DTU

    在本文中,我们将深入探讨 Netty 如何与 4G DTU 设备结合,以及如何构建基于 Java 的物联网(IoT)解决方案。 4G DTU,全称 4G 数据终端单元,是一种利用 4G 移动通信技术进行数据传输的设备。它通常用于远程监控、...

    Spring Boot + Netty 实现温湿度采集的展示

    在本项目中,"Spring Boot + Netty 实现温湿度采集的展示" 是一个结合了Spring Boot微服务框架和Netty高性能网络库的系统,用于实时监控和展示环境中的温湿度数据。这样的系统通常用于物联网(IoT)场景,如智能家居、...

    基于Netty和Consul的轻量级服务注册与转发Java设计源码

    本项目为轻量级服务注册与转发解决方案,采用Netty和Consul技术实现,旨在简化服务注册与发现过程,取代Spring Cloud全家桶的复杂架构。项目包含47个文件,主要采用Java编写,有效减轻系统负担,提升服务注册与转发...

    Netty 4.x User Guide 中文翻译《Netty 4.x 用户指南》

    Netty 4.x版本相较于之前的版本进行了大量的更新与改进,提供了更加高效、稳定的服务端和客户端网络通信解决方案。Netty 4.x用户指南为开发者提供了全面的学习文档,内容涵盖了Netty的基本使用、高级特性和架构概念...

    springmvc+netty实现聊天功能

    本项目通过结合Spring MVC和Netty框架,实现了基于Web的聊天功能。Spring MVC是Spring框架的一部分,主要用于构建Web应用,而Netty则是一个高性能、异步事件驱动的网络应用框架,常用于处理高并发的网络通信。 **...

    Netty实现简单的聊天消息群发功能

    Netty是一个高性能、异步事件驱动的网络应用框架,它为Java开发人员提供了高效率、可维护性以及可扩展性的网络通信解决方案。本项目通过Netty实现了一个简单的聊天消息群发功能,使得多个客户端可以向服务端发送消息...

    netty实现多人聊天室,有gui界面

    总的来说,这个项目展示了Netty如何与GUI库结合,提供一个实时、高效的多人聊天解决方案。通过学习和分析这个项目,你可以深入理解Netty的网络编程模型,以及如何构建交互式GUI应用。这对于想要在Java领域从事网络...

    netty源码最新版

    Pipeline 是一个责任链模式的实现,用于处理进来的数据并转发到下一个处理器。 2. **NIO 基础** Netty 基于 Java NIO(非阻塞I/O)构建,利用 Selectors 和 Channels 提供高效的 I/O 处理。了解 Java NIO 的基本...

    基于Netty+Redis+protobuf开发的即时通讯服务器.zip

    本项目"基于Netty+Redis+protobuf开发的即时通讯服务器"利用了三种技术:Netty作为网络通信库,Redis作为数据缓存与消息中间件,以及protobuf作为序列化协议,实现了高性能的实时通信解决方案。 首先,Netty是一个...

    netty-redis-zookeeper高并发实战学习-netty-redis-zookeeper.zip

    例如,Netty可以作为通信框架,处理来自客户端的请求,并将其转发到后端服务。Redis可以作为缓存,存储常用数据,减少对后端数据库的压力。ZooKeeper可以用于服务注册与发现,以及分布式锁,确保服务间的协作和一致...

    netty+kafka+storm

    在这里,Kafka可能作为数据的中间件,负责收集由Netty客户端发送的数据,然后转发到后续的处理阶段。 接下来,Apache Storm是一个实时计算系统,能够持续处理无界数据流,保证每个消息都能得到精确一次的处理。...

    JAVA Netty实现聊天室+私聊功能的示例代码

    JAVA Netty是一个基于Java的网络编程框架,提供了高性能和可伸缩性的网络编程解决方案。今天,我们将探讨如何使用JAVA Netty实现聊天室+私聊功能的示例代码。 聊天室功能实现 聊天室功能是指多个客户端可以连接到...

    Springboot_Netty:在SpringBoot的基础上整合Netty实现收发数据,并将数据存储到数据库

    Springboot_Netty在SpringBoot的基础上整合Netty实现收发数据,并将数据存储到数据库。功能对接telnet测试以及其他TCP客户端(如下位机)使用利用IDE(IDEA)或者 Maven运行 com.todorex.SpringbootNettyApplication...

    3.Netty的高并发应用 王瑞杭.pdf

    协商连接秘钥Netty集群负载均衡网关客户端Zookeeper服务注册和注销订阅发现服务登录验证连接指定的服务器异步任务消息队列业务系统消息队列Netty业务处理业务系统处理业务,并将结果传递至消息队列转发消息将需要...

    基于Java NIO的网络服务器Netty生产实例.zip

    2. **Netty框架**:Netty提供了一套完整的网络通信解决方案,包括各种协议的编解码器、事件驱动模型、高效的内存管理等。其核心组件有Bootstrap(引导类)、ServerBootstrap(服务器引导类)、Channel(网络通道)、...

    JAVA版基于netty的物联网高并发智能网关.zip

    Java版基于Netty的物联网高并发智能网关解决方案正为此目的而设计。Netty是一个高性能、异步事件驱动的网络应用框架,适用于开发可维护的高性能协议服务器和客户端。本项目的核心就是利用Netty的强大功能来构建一个...

    NettyServer

    对于这种情况,可能需要深入研究Android的多线程管理,或者寻找适合Android环境的Netty版本或替代方案。 解决Android上的问题,你可以尝试以下方法: 1. 检查AndroidManifest.xml中是否添加了网络访问权限:`...

    netty-all-4.1.24.Final JAR文件

    4. **零拷贝**:Netty通过其内部的数据结构和操作方式实现了零拷贝技术,减少了数据在内存之间的复制,提高了性能。 5. **丰富的协议支持**:Netty内置了对多种网络协议的支持,如HTTP、HTTPS、WebSocket、FTP、...

    openapi.zip

    OpenAPI.zip 提供了一种基于Netty框架的网关协议解析解决方案,它旨在实现跨平台、跨设备厂商的高效通信。本文将深入探讨该压缩包中的核心概念、技术和应用场景。 首先,Netty是一个高性能、异步事件驱动的网络应用...

Global site tag (gtag.js) - Google Analytics