Netty 与 Apache MINA

2023-12-08

它们都提供大致相同的功能。我应该选择哪一款来开发我的高性能 TCP 服务器?有什么优点和缺点?

参考链接:

阿帕奇米娜 (source)

Netty (source)


虽然 MINA 和 Netty 有着相似的目标,但它们在实践中却有很大不同,您应该仔细考虑您的选择。我们很幸运,因为我们有很多使用 MINA 的经验,并且有时间和 Netty 一起玩。我们特别喜欢更简洁的 API 和更好的文档。纸面上的表现似乎也更好。更重要的是,我们知道 Trustin Lee 会随时回答我们的任何问题,他确实做到了。

我们发现 Netty 一切都变得更容易。时期。当我们试图重新实现 MINA 上已有的相同功能时,我们是从头开始的。通过遵循优秀的文档和示例,我们最终以更少的代码获得了更多的功能。

Netty Pipeline 对我们来说效果更好。它在某种程度上比 MINA 更简单,在 MINA 中,一切都是处理程序,由您决定是处理上游事件、下游事件还是消耗更多低级内容。在“重放”解码器中吞噬字节几乎是一种乐趣。能够如此轻松地即时重新配置管道也非常好。

但恕我直言,Netty 的明星吸引力在于能够创建具有“覆盖范围”的管道处理程序。您可能已经在文档中阅读过有关此覆盖注释的信息,但本质上它在一行代码中为您提供了状态。没有混乱,没有会话映射,同步和类似的东西,我们只需声明常规变量(例如“用户名”)并使用它们。

但后来我们遇到了障碍。我们已经在 MINA 下有了一个多协议服务器,其中我们的应用程序协议运行在 TCP/IP、HTTP 和 UDP 上。当我们切换到 Netty 时,我们在几分钟内将 SSL 和 HTTPS 添加到列表中!到目前为止一切顺利,但当涉及到 UDP 时,我们意识到我们犯了错误。 MINA 对我们非常好,因为我们可以将 UDP 视为“连接”协议。在 Netty 下没有这样的抽象。 UDP 是无连接的,Netty 也是如此对待它。 Netty 在比 MINA 更低的级别上暴露了更多 UDP 的无连接特性。在 Netty 下使用 UDP 可以做一些事情,而在 MINA 提供的更高级别抽象下却无法做到这一点,但我们却依赖于此。

添加一个“连接的UDP”包装器什么的并不是那么简单。鉴于时间限制,并且根据 Trustin 的建议,最好的方法是在 Netty 中实现我们自己的传输提供商,但这不会很快,我们最终不得不放弃 Netty。

因此,请仔细研究它们之间的差异,并快速进入可以测试任何棘手功能是否按预期工作的阶段。如果您对 Netty 能够完成这项工作感到满意,那么我会毫不犹豫地选择它而不是 MINA。如果您从 MINA 迁移到 Netty,则同样适用,但值得注意的是,这两个 API 确实有显着不同,您应该考虑对 Netty 进行虚拟重写 - 您不会后悔的!

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Netty 与 Apache MINA 的相关文章

  • Android - 如何访问 onResume 中 onCreate 中实例化的 View 对象?

    In my onCreate 方法 我正在实例化一个ImageButton View public void onCreate Bundle savedInstanceState super onCreate savedInstanceSt
  • 如何打印整个字符串池?

    我想打印包含文字的整个字符串池String使用添加的对象intern 就在垃圾收集之前 JDK有没有隐式的方法来进行这样的操作 我们如何检查字符串池 EDIT The comment suggests that there may be a
  • java.lang.Class: 在 java 程序中初始化 log4j 属性文件时出错

    我正在尝试使用 log4j 运行独立的 java 程序 但在调试时收到以下消息 控制台上没有 log4j 相关日志 log Logger 1343 java lang Class ERROR in 18b4aac2 有人可以建议这里出了什么
  • 由于连接超时,无法通过 ImageIO.read(url) 获取图像

    下面的代码似乎总是失败 URL url new URL http userserve ak last fm serve 126 8636005 jpg Image img ImageIO read url System out printl
  • 如何从另一个xml文件动态更新xml文件?

    我想从另一个 xml 文件更新 xml 文件 我使用了一个 xml 文件 如下所示 one xml
  • 通过 InjectMocks Spy 注入对象

    我需要对一个类运行一系列单元测试 该类具有 Autowired Logger 实现 实现的基本思想是 Mock Logger logger InjectMocks TestedClass tested 但我想保存日志输出功能 Mockito
  • 如何对 IntStream 进行逆序排序

    我正在使用 txt 文件读取数字BufferedReader 我想颠倒该流中元素的顺序 以便在收集它们时 它们将从最高到最低排列 我不想在构建数组后进行排序 因为我不知道其中可能有多少元素 我只需要最高的 N 个元素 in new Buff
  • Java 泛型/类型调度问题

    考虑以下程序 import java util List import java util ArrayList public class TypeTest public static class TypeTestA extends Type
  • Spring Stomp over Websocket:流式传输大文件

    我的SockJs客户端在网页中 发送帧大小为16K的消息 消息大小限制决定了我可以传输的文件的最大大小 以下是我在文档中找到的内容 Configure the maximum size for an incoming sub protoco
  • 服务器到 Firebase HTTP POST 结果为响应消息 200

    使用 Java 代码 向下滚动查看 我使用 FCM 向我的 Android 发送通知消息 当提供正确的服务器密钥令牌时 我收到如下所示的响应消息 之后从 FCM 收到以下响应消息 Response 200 Success Message m
  • 场景生成器删除 fxml 文件中的导入

    我使用场景构建器 Gluon Scene Builder JavaFX Scene Builder 8 1 1 来创建应用程序的 UI 并使用 Eclipse 开发 JavaFX 现在 每次我在场景生成器中保存某些内容时 它都会从 fxml
  • 为什么 ConcurrentHashMap::putIfAbsent 比 ConcurrentHashMap::computeIfAbsent 更快?

    使用 ConcurrentHashMap 我发现computeIfAbsent 比putIfAbsent 慢两倍 这是简单的测试 import java util ArrayList import java util List import
  • 从 html 页面和 javascript 调用 java webservice

    我正在尝试从 javascript 调用 java 实现的 Web 服务 使用 NetBeans IDE 我读过很多关于 jQuery 和 AJAX 的内容 但我似乎无法掌握它 假设我的 Web 服务 WSDL 位于 http localh
  • 从 Java 日历迁移到 Joda 日期时间

    以前 当我第一次设计股票应用相关软件时 我决定使用java util Date表示股票的日期 时间信息 后来我体会到了大部分方法java util Date已弃用 因此 很快 我重构了所有代码以利用java util Calendar 然而
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • 我想要一个 Java 阿拉伯语词干分析器

    我正在寻找阿拉伯语的 Java 词干分析器 我找到了一个名为 AraMorph 的库 但它的输出是无法控制的 并且它会形成不需要的单词 还有其他阿拉伯语词干分析器吗 这是新的阿拉伯语词干分析器 Assem 的阿拉伯语轻词干分析器 http
  • 如何将实例变量传递到 Quartz 作业中?

    我想知道如何在 Quartz 中外部传递实例变量 下面是我想写的伪代码 如何将 externalInstance 传递到此作业中 public class SimpleJob implements Job Override public v
  • Java中有类似分支/跳转表的东西吗?

    Java有类似分支表或跳转表的东西吗 分支表或跳转表是 根据维基百科 http en wikipedia org wiki Branch table 用于描述使用分支指令表将程序控制 分支 转移到程序的另一部分 或可能已动态加载的不同程序
  • Java 推断泛型类型

    我正在寻找类似的推断捕获泛型类型的概念 类似于以下方法片段 但不是捕获泛型类型的类 public
  • java中如何找到class文件的包

    我正在编写一个使用 class 文件的 java 程序 我希望能够读取文件系统上的 class 文件 使用 InputStream 并确定它所在的包 该 class 文件可能不在一个好的包目录结构中 它可能位于某个随机位置 我怎样才能做到这

随机推荐

  • NodeJS 应用程序的安全分发

    What NodeJS 应用程序可以作为二进制分发吗 IE 您通过 V8 将 js 应用程序编译为其本机二进制文件 并将该二进制文件分发给客户端吗 如果您可以完全访问 NodeJS 服务器 或者您能做的只是缩小代码 Why 我们在 Node
  • 反应本机材料顶部选项卡导航器滑动禁用取决于屏幕

    只想使地图组件禁用滑动 但在使用 swipeEnabled 时应用整个屏幕 我能怎么做 const Tab createMaterialTopTabNavigator const Tabs gt return
  • 有序列表
      ,以 XHTML Strict 开始索引?

    有没有办法在遵循 XHTML Strict 的同时从特定索引开始有序列表 使用 start n 效果很好 但已经已弃用 预期目的是通过分页恢复索引 我看到了一些对 CSS 解决方案的引用 但是起始索引不能像已弃用的 start 情况中的属性
  • 如何在我们自己的 perl 脚本中导入多个自定义模块?

    我说过 100 个自定义包 例如 file1 pm file2 pm file3 pm file4 pm file5 pm file6 pm 每个文件包含一个函数 我想将所有内容导入到我的每个简单的 Perl 脚本中 如何以简单的方式导入它
  • 关于 C++ 中自定义对象的构造函数/析构函数和 new/delete 运算符

    假设我有一个自己创建的链表 它有自己的析构函数 可以释放内存 这个链表不会重载new或delete 现在 我正在尝试创建一个所述链表的数组 开放散列 如果我理解正确的话 然后我在这个开放哈希类的构造函数中分配必要的内存 在构造函数内部调用的
  • 减少 ggplot2 中条形图组之间的空间

    我无法删除 geom plot 中条形组两侧的额外空白 我想做罗兰在这里取得的成就 删除条形图之间的空间ggplot2但是当我尝试实施他的解决方案时 我收到错误 警告消息 geom bar 不再有binwidth范围 请用geom hist
  • 编译器错误 CS0019:比较两个整数

    在 C 中 为什么第一个 if 语句会给出编译错误 而第二个则不会 有人可以解释一下吗 1 if num 1 1 Console WriteLine Test 这给了我 错误CS0019运算符 不能应用于 int 和 bool 类型的操作数
  • 使用 Achartengine 可以实现多个堆叠条形图吗?

    我尝试将另一组值添加到演示示例中使用 achartengine 堆积条形图 但是我引入的新值没有出现在图表上 堆叠条是否仅限于两个条 public Intent getIntent Context context String titles
  • 用于在 Int、Double 和 Integer 类型实例之间进行选择的 Haskell 规则

    我想知道在 GHCi 中评估表达式时 Haskell 使用什么规则来始终决定 Integer 实例而不是其他实例1 2 import Debug Trace class MyFuns a where a a a instance MyFun
  • 静态函数调用之前的泛型尖括号[重复]

    这个问题在这里已经有答案了 我一直使用泛型并且总是看到像这样使用尖括号 Class
  • 从 App.OnStartup 调用异步 Web API 方法

    我将 App OnStartup 更改为异步 以便我可以在 Web api 上调用异步方法 但现在我的应用程序不显示其窗口 我在这里做错了什么 protected override async void OnStartup StartupE
  • ProcessBuilder 无法运行带参数的 python 脚本

    好的 我有一个通过 ProcessBuilder 运行的 python 脚本 一切正常 我遇到的问题是每当我将参数传递给 python 脚本时 python 脚本都会以unrecognized argumets 但如果我采取确切的命令并将其
  • 运行 Jar 应用程序时 Java Web Start NumberFormatException

    在尝试使用 JWS JNLP 启动来运行 Jar 应用程序时 它一直给我这个错误 甚至找不到错误在哪里 任何指示都会有所帮助 如果有人可以告诉我这个错误的潜在位置在哪里 我可以在这里找到该代码 java lang NumberFormatE
  • 更改窗口标题中的光标

    我有一个 WinForm 现在我需要在光标位于窗口标题部分时更改光标 我有一些代码正在运行 它有两个问题 当光标位于边缘时 它还会更改光标 应显示正常的调整大小光标 我发现我需要这样的东西WM NCHITTEST HTTOP 但是我该如何结
  • 在Java中,如何判断线程是否正在运行?

    如何判断一个线程是否正在运行 Thread isAlive
  • 将文件放在 HDFS 上,名称中包含空格

    我有一个名为file name 1 zip 里面有空格和括号 我想把这个文件放在HDFS上 但每次我尝试把它通过hadoop fs put 我得到一个例外 我什至尝试在文件周围添加引号 甚至尝试转义空格和括号 但它不起作用 hduser l
  • 如何将一个 ArrayList 的内容复制到另一个 ArrayList 中?

    我有一些数据结构 我想使用一个作为临时数据结构 另一个作为非临时数据结构 ArrayList myObject new ArrayList ArrayList myTempObject new ArrayList fill myTempOb
  • Firefox 中的 Firefox 5 调度事件

    我有一些使用的代码dispatchEvent模拟点击 同样的代码在 Chrome 中运行良好 但在 Firefox 中不起作用 这是代码 var evt document createEvent MouseEvents evt initEv
  • 在 Linux 上连接两个文件

    我有两个文件 我想加入他们 cat t1 1 1 2 2 2 2 cat t2 1 2 1 我想要下面的输出 cat joind txt 1 1 2 2 2 2 1 1 2 但是当我使用join命令 第三行不会出现在输出中 一个简单的awk
  • Netty 与 Apache MINA

    它们都提供大致相同的功能 我应该选择哪一款来开发我的高性能 TCP 服务器 有什么优点和缺点 参考链接 阿帕奇米娜 source Netty source 虽然 MINA 和 Netty 有着相似的目标 但它们在实践中却有很大不同 您应该仔