Netty在rocketmq中的实现 二 NettyRemotingClient

昨天我们学习了 NettyRemotingServer的实现,今天来学习client的实现


 public void start() {
        this.defaultEventExecutorGroup = new DefaultEventExecutorGroup(//
                nettyClientConfig.getClientWorkerThreads(), //
                new ThreadFactory() {

                    private AtomicInteger threadIndex = new AtomicInteger(0);


                    @Override
                    public Thread newThread(Runnable r) {
                        return new Thread(r, "NettyClientWorkerThread_" + this.threadIndex.incrementAndGet());
                    }
                });

        Bootstrap handler = this.bootstrap.group(this.eventLoopGroupWorker).channel(NioSocketChannel.class)//
                //
                .option(ChannelOption.TCP_NODELAY, true)
                //
                .option(ChannelOption.SO_KEEPALIVE, false)
                //
                .option(ChannelOption.CONNECT_TIMEOUT_MILLIS, nettyClientConfig.getConnectTimeoutMillis())
                //
                .option(ChannelOption.SO_SNDBUF, nettyClientConfig.getClientSocketSndBufSize())
                //
                .option(ChannelOption.SO_RCVBUF, nettyClientConfig.getClientSocketRcvBufSize())
                //
                .handler(new ChannelInitializer<SocketChannel>() {
                    @Override
                    public void initChannel(SocketChannel ch) throws Exception {
                        ch.pipeline().addLast(//
                                defaultEventExecutorGroup, //
                                new NettyEncoder(), //
                                new NettyDecoder(), //
                                new IdleStateHandler(0, 0, nettyClientConfig.getClientChannelMaxIdleTimeSeconds()), //
                                new NettyConnetManageHandler(), //
                                new NettyClientHandler());
                    }
                });

        this.timer.scheduleAtFixedRate(new TimerTask() {

            @Override
            public void run() {
                try {
                    NettyRemotingClient.this.scanResponseTable();
                } catch (Exception e) {
                    log.error("scanResponseTable exception", e);
                }
            }
        }, 1000 * 3, 1000);

        if (this.channelEventListener != null) {
            this.nettyEventExecuter.start();
        }




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Netty 实现 Socket 通信解码需要使用到 Netty 的解码器。Netty 提供了一系列的解码器,可以根据不同的传输协议进行解码。其常用的有以下几种: 1. ByteToMessageDecoder:将字节流解码成消息对象。该解码器可以处理分包和粘包问题。 2. LengthFieldBasedFrameDecoder:根据消息的长度进行解码,可以处理粘包和分包问题。 3. LineBasedFrameDecoder:按行分割文本,通常用于处理文本协议。 4. DelimiterBasedFrameDecoder:按照指定的分隔符进行分割,通常也用于处理文本协议。 以下是一个使用 ByteToMessageDecoder 的示例代码,假设我们要将字节流解码成一个自定义的 Message 对象: ```java public class MessageDecoder extends ByteToMessageDecoder { @Override protected void decode(ChannelHandlerContext ctx, ByteBuf in, List<Object> out) throws Exception { if (in.readableBytes() < 4) { // 如果可读字节数小于 4,则返回等待更多数据 return; } // 读取消息长度 int length = in.readInt(); if (in.readableBytes() < length) { // 如果可读字节数小于消息长度,则返回等待更多数据 in.resetReaderIndex(); return; } // 读取消息内容 byte[] content = new byte[length]; in.readBytes(content); // 将消息解码成 Message 对象,并添加到输出列表 Message message = decodeMessage(content); out.add(message); } private Message decodeMessage(byte[] content) { // 自定义消息解码逻辑 return null; } } ``` 在上述代码,我们继承了 ByteToMessageDecoder,重写了 decode 方法。该方法会在每次读取到数据时被调用,我们在该方法进行解码操作,并将解码后的消息添加到输出列表。在解码过程,我们先读取消息的长度,再根据长度读取消息内容,最后将消息内容解码成 Message 对象。需要注意的是,由于 Netty 采用了零拷贝技术,我们无需手动释放 ByteBuf 对象,Netty 会自动释放。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值