netty DefaultChannelPipeline 异常捕获

2024-04-08

不幸的是,我不明白 netty 服务器的输出:

BUILD SUCCESSFUL
Total time: 3 seconds
Jul 27, 2014 2:04:44 AM io.netty.handler.logging.LoggingHandler channelRegistered
INFO: [id: 0xcad25a31] REGISTERED
Jul 27, 2014 2:04:44 AM io.netty.handler.logging.LoggingHandler bind
INFO: [id: 0xcad25a31] BIND(0.0.0.0/0.0.0.0:4454)
Jul 27, 2014 2:04:44 AM io.netty.handler.logging.LoggingHandler channelActive
INFO: [id: 0xcad25a31, /0:0:0:0:0:0:0:0:4454] ACTIVE
Jul 27, 2014 2:04:59 AM io.netty.handler.logging.LoggingHandler logMessage
INFO: [id: 0xcad25a31, /0:0:0:0:0:0:0:0:4454] RECEIVED: [id: 0xff40b8a2, /127.0.0.1:37558 => /127.0.0.1:4454]
Jul 27, 2014 2:04:59 AM net.bounceme.dur.netty.ServerHandler <init>
INFO: starting..
Jul 27, 2014 2:04:59 AM io.netty.channel.DefaultChannelPipeline$TailContext exceptionCaught
WARNING: An exceptionCaught() event was fired, and it reached at the tail of the pipeline. It usually means the last handler in the pipeline did not handle the exception.
io.netty.handler.codec.TooLongFrameException: Adjusted frame length exceeds 1048576: 2901213193 - discarded
    at io.netty.handler.codec.LengthFieldBasedFrameDecoder.fail(LengthFieldBasedFrameDecoder.java:501)
    at io.netty.handler.codec.LengthFieldBasedFrameDecoder.failIfNecessary(LengthFieldBasedFrameDecoder.java:477)
    at io.netty.handler.codec.LengthFieldBasedFrameDecoder.decode(LengthFieldBasedFrameDecoder.java:403)
    at io.netty.handler.codec.serialization.ObjectDecoder.decode(ObjectDecoder.java:68)
    at io.netty.handler.codec.LengthFieldBasedFrameDecoder.decode(LengthFieldBasedFrameDecoder.java:343)
    at io.netty.handler.codec.ByteToMessageDecoder.callDecode(ByteToMessageDecoder.java:241)
    at io.netty.handler.codec.ByteToMessageDecoder.channelRead(ByteToMessageDecoder.java:149)
    at io.netty.channel.AbstractChannelHandlerContext.invokeChannelRead(AbstractChannelHandlerContext.java:333)
    at io.netty.channel.AbstractChannelHandlerContext.fireChannelRead(AbstractChannelHandlerContext.java:319)
    at io.netty.channel.DefaultChannelPipeline.fireChannelRead(DefaultChannelPipeline.java:787)
    at io.netty.channel.nio.AbstractNioByteChannel$NioByteUnsafe.read(AbstractNioByteChannel.java:125)
    at io.netty.channel.nio.NioEventLoop.processSelectedKey(NioEventLoop.java:511)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeysOptimized(NioEventLoop.java:468)
    at io.netty.channel.nio.NioEventLoop.processSelectedKeys(NioEventLoop.java:382)
    at io.netty.channel.nio.NioEventLoop.run(NioEventLoop.java:354)
    at io.netty.util.concurrent.SingleThreadEventExecutor$2.run(SingleThreadEventExecutor.java:116)
    at io.netty.util.concurrent.DefaultThreadFactory$DefaultRunnableDecorator.run(DefaultThreadFactory.java:137)
    at java.lang.Thread.run(Thread.java:744)

^Cthufir@dur:~/NetBeansProjects/AgentServer$ 
thufir@dur:~/NetBeansProjects/AgentServer$ 

大概基于网络的服务器正在抱怨它在某些方面收到了错误的数据?

客户端代码:

package net.bounceme.dur.client.gui;

import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.net.Socket;
import java.util.logging.FileHandler;
import java.util.logging.Handler;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.logging.SimpleFormatter;
import net.bounceme.dur.client.jdbc.Title;

public final class ApplicationDriver {

    private static final Logger log = Logger.getLogger(ApplicationDriver.class.getName());
    private TitlesGUI gui = null;
    private Handler handler = null;

    public ApplicationDriver() throws IOException, ClassNotFoundException {
        handler = new FileHandler("application.log");
        handler.setFormatter(new SimpleFormatter());
        log.setLevel(Level.INFO);
        log.addHandler(handler);
        log.info("starting log..");
        MyProps p = new MyProps();
        String host = p.getHost();
        int port = p.getServerPort();
        guiThread();
        readWrite(host, port);
    }

    private void guiThread() {
        Thread g;
        g = new Thread() {
            @Override
            public void run() {
                try {
                    gui = new TitlesGUI();
                } catch (IOException ex) {
                    log.severe(ex.toString());
                }
                gui.setVisible(true);
            }
        };
        g.start();
    }

    public static void main(String... args) throws IOException, ClassNotFoundException {
        new ApplicationDriver();
    }

    private void readWrite(final String host, final int port) throws IOException {
        Thread inputOutput;
        final Socket socket = new Socket(host, port);
        inputOutput = new Thread() {
            @Override
            public void run() {
                while (true) {
                    try (ObjectOutputStream objectOutputStream = new ObjectOutputStream(socket.getOutputStream());
                            ObjectInputStream objectInputStream = new ObjectInputStream(socket.getInputStream())) {
                        gui.setTitle((Title) objectInputStream.readObject());
                        Thread.sleep(1000);
                    } catch (IOException | ClassNotFoundException | InterruptedException ex) {
                        log.severe(ex.toString());
                    }
                }
            }

        };
        inputOutput.start();
    }
}

客户端使用常规套接字而不是 netty 是否有问题?客户端和服务器端都会发送 POJO。 (这Title类是可序列化的并且serialVersionUID值匹配。)

来自 GUI 客户端的方法(有点大,它是 Netbeans Swing JFrame):

public void setTitle(Title title) {
    this.title = title;
    text.setText(title.toString());
}

上述方法的要点是为了某物将对象发送到 GUI,然后相应地更新。同样,我想触发更新,或者以其他方式将 GUI 连接到套接字 I/O。

我不太明白 netty 服务器的输出。服务端使用netty,客户端使用socket,是不是有问题?两者都使用相同的 POJO,以及serialVersionUID 值。这是 netty 处理程序代码:

package net.bounceme.dur.netty;

import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import java.util.logging.Logger;
import net.bounceme.dur.jdbc.Title;

public class ServerHandler extends SimpleChannelInboundHandler<Title> {

    private static final Logger log = Logger.getLogger(ServerHandler.class.getName());

    public ServerHandler() {
        log.info("starting..");
    }

    @Override
    public boolean acceptInboundMessage(Object msg) throws Exception {
        log.info(msg.toString());
        return true;
    }

    @Override
    public void channelRead(ChannelHandlerContext ctx, Object msg) throws Exception {
        log.info(msg.toString());
        ctx.write(new Title());
    }

    @Override
    protected void channelRead0(ChannelHandlerContext chc, Title title) throws Exception {
        log.info(title.toString());
        chc.write(new Title());
    }
}

显然,没有执行任何服务器处理程序代码,因为在客户端连接后一切都会立即爆炸。

服务器代码:

package net.bounceme.dur.netty;

import io.netty.bootstrap.ServerBootstrap;
import io.netty.channel.ChannelInitializer;
import io.netty.channel.ChannelPipeline;
import io.netty.channel.EventLoopGroup;
import io.netty.channel.nio.NioEventLoopGroup;
import io.netty.channel.socket.SocketChannel;
import io.netty.channel.socket.nio.NioServerSocketChannel;
import io.netty.handler.codec.serialization.ClassResolvers;
import io.netty.handler.codec.serialization.ObjectDecoder;
import io.netty.handler.codec.serialization.ObjectEncoder;
import io.netty.handler.logging.LogLevel;
import io.netty.handler.logging.LoggingHandler;
import java.security.cert.CertificateException;
import java.util.logging.Logger;
import javax.net.ssl.SSLException;

public final class Server {

    private static final Logger log = Logger.getLogger(Server.class.getName());

    public static void main(String[] args) throws Exception {
        MyProps p = new MyProps();
        int port = p.getServerPort();
        new Server().startServer(port, false);
    }

    private void startServer(int port, boolean ssl) throws CertificateException, SSLException, InterruptedException {
        EventLoopGroup bossGroup = new NioEventLoopGroup(1);
        EventLoopGroup workerGroup = new NioEventLoopGroup();
        try {
            ServerBootstrap b = new ServerBootstrap();
            b.group(bossGroup, workerGroup)
                    .channel(NioServerSocketChannel.class)
                    .handler(new LoggingHandler(LogLevel.INFO))
                    .childHandler(new ChannelInitializer<SocketChannel>() {
                        @Override
                        public void initChannel(SocketChannel ch) throws Exception {
                            ChannelPipeline p = ch.pipeline();
                            p.addLast(
                                    new ObjectEncoder(),
                                    new ObjectDecoder(ClassResolvers.cacheDisabled(null)),
                                    new ServerHandler());
                        }
                    });
            b.bind(port).sync().channel().closeFuture().sync();
            log.info("connected!");
        } finally {
            bossGroup.shutdownGracefully();
            workerGroup.shutdownGracefully();
        }
    }
}

The TooLongFrameException由 提出LengthFieldBasedFrameDecoder指下列之一:

  • 远程对等方发送了一条非常大的消息,超出了限制。消息的默认最大长度为 1 MiB。如果您希望收到大于该长度的消息,请在构建消息时指定替代的最大长度LengthFieldBasedFrameDecoder.
  • 您传递了错误的参数LengthFieldBasedFrameDecoder以便它解码消息中的错误位置。在这种情况下,你最好重新阅读JavadocLengthFieldBasedFrameDecoder为您指定正确的值。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

netty DefaultChannelPipeline 异常捕获 的相关文章

随机推荐

  • AttributeError:“float”对象没有属性“lower”

    我面临这个属性错误 并且我陷入了如何处理浮点值 如果它们出现在推文中 的问题 流式推文必须小写并标记化 因此我使用了 split 函数 有人可以帮我解决这个问题 有任何解决方法或解决方案吗 这是error我正在 AttributeError
  • 如何清理redis中不活跃的玩家?

    我正在制作一个使用 redis 来存储游戏状态的游戏 它可以很好地跟踪位置和玩家 但我没有一个好的方法来清理不活跃的玩家 每当玩家移动时 这是一个半慢速移动游戏 想想每秒 1 5 帧 我就会用新位置更新哈希并删除旧位置键 跟踪活跃玩家的最佳
  • 在 Mac OS X 上使用 docx2txt 和 Git 对 Word .docx 文件进行版本控制

    On Git网站上有关于 Microsoft Word 版本控制的详细说明 doc文件与catdoc http git scm com book en Customizing Git Git Attributes http git scm
  • Android WebView LoadData - 土耳其字符

    如何在 webview 中将土耳其语字符 显示为 loadData 我的网络视图是 mWebView loadData detailsHtml text html UTF 8 thanks webView loadData htmlStr
  • 我需要进行哪些更改才能使 Magento 与 PHP 5.3 配合使用?

    我需要将我的服务器升级到 PHP 5 3 但安装了 Magento 而且我知道 Magento 不能很好地与 PHP 5 3 配合使用 我认为变化不会太大 根据我所读到的 但是 我想我应该向大众开放 有人成功做到这一点吗 如果是这样 你记好
  • 开关盒无法正常工作

    当我离开现场时 我发布了下面的代码ip空白 空并向其他字段赋值 toast总是给出消息KATimer is invalid or missing 我期望看到一个toast显示一条消息 指示空字段 但下面的代码 如果任何字段为空 它总是说KA
  • 有没有一种方法可以列出所有对象,例如使用同义词的视图?

    就像罐头上说的那样 如何确定哪些 SQL 对象正在使用给定的 SYNONYM 我想一种方法是搜索 PROC 或 VIEW 的所有内容并运行LIKE SYN NAME 但这看起来很笨拙 select from sys sql expressi
  • 如何在.NET MAUI 中创建可重用组件?

    我最近刚刚开始使用 Net MAUI 但现在我想知道如何使用一段代码 例如我的所有页面上都有一个自制的导航栏 因为在所有 10 个页面上编写相同的代码是没有意义的 我想知道是否有办法创建一个可以像 React 或 Angular 一样重用的
  • 使用 psycopg2 插入多行

    根据psycopg2 用一个查询插入多行 https stackoverflow com questions 8134602 psycopg2 insert multiple rows with one query 使用 psycopg2
  • Visual Studio Windows 窗体预览以不同的分辨率?

    我喜欢以 1680 x 1050 分辨率运行 Visual Studio 但是 我们的客户通常使用 1024 x 768 是否有某种方法可以使我的编辑器保持原始分辨率 但以不同的分辨率显示表单设计器 谢谢 Austin 我建议您购买一个额外
  • 如何获取 google+ 的公共数据以及如何使用 php 从我的网站发布到 google+

    我的网站和 google plus 之间的身份验证工作正常 但我的详细信息和我的活动现在没有显示 我们得到 Googleplus 的 getAccessToken 就像 access token ya29 AHES6ZSTauVKgrdDU
  • 继承后受保护的成员行为。

    我对受保护的标识符有一些疑问 在 K Sierra 编写的 Sun Certified Java Programmer Study Guide 的第一章中 我发现了以下信息 一旦包外子类继承了受保护的成员 该成员 由子类继承 就成为子类外部
  • 将 Pandas 数据帧转换为时间序列

    我有一个熊猫数据框 Out 57 lastrun rate 0 2013 11 04 12 15 02 0 1 2013 11 04 13 14 50 4 2 2013 11 04 14 14 48 10 3 2013 11 04 16 1
  • 迭代器的无限产量

    我正在尝试学习一些红宝石 想象一下 我正在循环并执行一个长时间运行的过程 在这个过程中 我希望获得一个旋转器 只要需要就可以 所以我可以这样做 a aNow 0 skip setup a big loop print a aNow aNow
  • 在 beautiful soup 中使用 lambda 函数

    尝试匹配包含某些文本的链接 我正在做 links soup find all a href lambda x org in x 但这会引发 TypeError argument of type NoneType is not iterabl
  • 如何设计一个同时安全的多用户 Ajax Web 应用程序

    我有一个网页 显示来自服务器的大量数据 通信是通过ajax完成的 每次用户交互并更改此数据 假设用户 A 重命名某些内容 时 它都会告诉服务器执行该操作 然后服务器返回新更改的数据 如果用户 B 同时访问该页面并创建一个新的数据对象 它将再
  • 添加依赖项和库 .jar 后无法解析 json import Intellij

    将在线源中的 json lib 2 4 jdk15 jar 添加到项目依赖项后 我似乎无法解决此问题 提供的屏幕截图显示了我正在做的事情的演练 是的 我多次尝试过 使缓存无效并重新启动 The error 这是我的项目结构 cmd 或 文件
  • 如果字符串中间出现空字符怎么办?

    我知道字符串的结尾由空字符表示 但我无法理解以下代码的输出 include
  • Google Analytics - 记录出站链接 - 打开新窗口

    我用过以下通过谷歌分析记录出站链接 是否可以在新窗口中打开链接 a href a
  • netty DefaultChannelPipeline 异常捕获

    不幸的是 我不明白 netty 服务器的输出 BUILD SUCCESSFUL Total time 3 seconds Jul 27 2014 2 04 44 AM io netty handler logging LoggingHand