【问题标题】:Java Server Side App, How to?Java 服务器端应用程序,如何?
【发布时间】:2025-12-26 09:45:11
【问题描述】:

我正在用 Java 构建一个可扩展的服务器端应用程序,但我需要知道“该做什么和不该做什么”。

该应用程序需要客户端通过 TCP 套接字连接到服务器,我听说过很多关于 Apache MINA 的好消息,所以我想尝试一下并围绕它进行构建。我还需要应用程序与数据库通信,并根据请求或推送向客户端发送合适的数据。

我会管理我自己的家庭服务器,这样即使这也将在我的控制之下。

我对以下几点有一些疑问:

  • 服务器端是否需要有一个 GUI,用于报告状态、连接性 和例外。如果是这样,我该怎么做 实现这个,我应该使用 Swing 吗?
  • MINA 正在处理连接,但 我如何处理数据库(MySQL)?
  • 我如何测试这个应用程序 可扩展性,我该如何模拟 客户端与服务器的连接。
  • 有没有什么框架可以做 以上所有还是我必须 处理各个方面。

【问题讨论】:

  • 当您说“TCP 套接字”时,您是指自定义套接字级协议,还是 HTTP 之类的标准协议? “TCP Sockets”并没有真正缩小范围。
  • Apache MINA 的替代方案:jboss.org/netty
  • 自定义套接字层协议。我听说过 Netty 和 xsocket、Grizzly、Quickserver 等其他产品。但我不知道什么对我有好处,所以我只是从众多产品中挑选了 MINA。 Netty 有什么优点吗?
  • 不是真的,我只是给你选择:)

标签: java apache-mina


【解决方案1】:

MINA 是一个优秀的框架。

  • 服务器端是否需要有 GUI 来报告状态、连接性和异常。如果是这样,我该如何实现,我应该使用 Swing 吗?

简短回答:不!
长答案:服务器通常没有 GUI,因为大多数大型服务器系统甚至根本没有显示器。更好的解决方案是使用 JMX 提供统计信息。 MINA 具有预定义的 MBean,您只需将其添加到 JMX 服务。使用 JMX 客户端,您可以访问这些信息并构建 GUI。
只需尝试 JConsole 并选择一个本地 Java 应用程序即可了解它。

  • MINA 正在处理连接,但我如何处理数据库(MySQL)?

有很多方法可以处理数据库。纯 JDBC、Hibernate 或其他 ORM 框架。只要确保你使用的东西是线程安全的!

  • 如何测试此应用的可扩展性,如何模拟客户端与服务器的连接。

要么编写一个简单的客户端并启动它几千次,要么使用专门的测试框架。如果您使用的是现有协议,那么可能会有一个特定的协议。

  • 是否有任何框架可以完成上述所有工作,或者我必须处理每个方面。

取决于协议和您想要实现的目标。有一个基于 MINA 的 FTP 服务器,它可以合二为一,但这是一个特定的实现,不适合您的需求。
如果您使用自己的协议,则必须自己实现编码/解码器以及协议和消息的处理。这包括在数据库中存储消息信息。

【讨论】:

    【解决方案2】:

    我如何测试这个应用程序 可扩展性,我如何模拟客户端 与服务器的连接。

    对于可扩展性测试,我推荐 Apache JMeter。它是用于创建和测量应用程序负载的出色、免费且相当简单的工具。您可以获得有关响应时间、每秒事务数、服务器负载等的信息。

    我在 HTTP 应用程序中使用过很多次。对于您的 TCP 应用程序,它有一个 TCP 采样器,但使用您已经编写的连接代码为其 Java 采样器创建一个实现可能会更容易。我还建议将它与rstatd sampler plugin 结合使用,这样您就可以在测试期间测量服务器 CPU/内存。

    熟悉该工具可能需要几天时间,但它对我很有帮助。

    服务器端是否需要有图形用户界面, 报告状态、连接性和 例外。

    老实说,服务器端的图形用户界面可能有点矫枉过正。当然,拥有一些带有一堆闪烁的红绿灯和滚动日志的控制台会很好,但归根结底,这些都只是 YAGNI 项目。

    只要您的服务器正在为您要关注的事务和事件写入日志和审计信息,这就足够了。拥有 GUI 只会增加服务器的复杂性,可能会产生更多错误。另外,如果您有效地使用日志,您可以插入其他监控/警报机制(例如 SNMP)。

    我如何处理数据库(MySQL)?

    其他答案有一些很好的建议;这是一个可能更好地涵盖本身的主题,并且有很多关于它的问题。我建议您对 ORM+Java 进行一些搜索,以获得一些好的意见。以下是一些不错的链接:

    您可以找到对所有不同 ORM 的不同意见,以及根本不使用它们的倡导者。就其本身而言,我没有意见 - 只需在研究选项后使用您认为适合该工作的内容即可。

    有没有什么框架可以做所有 以上或我必须处理 各个方面。

    可疑,如果有的话,它可能太通用了,你最终还是会为它编写一堆代码。对于 ORM + GUI(如果您使用 GUI),有开箱即用的 MVC+数据库 Web 解决方案可以在 JVM 上运行,例如 Grails。但是您的大多数问题都涉及不同的问题领域,每个问题都需要自己单独的解决方案。

    【讨论】:

    • 是 Hibernate J2SE 还是 J2EE 容器,我可以按照 Pascal Thivent 的建议使用带有 c3p0 的 jdbc 进行连接池吗?这样可以扩展吗?
    • 对不起,我没有感谢您的解释清楚!谢谢!!
    • 没问题。至于缩放,取决于你需要多少。您的问题并没有真正说明您需要支持多少负载。任何一种解决方案(Hibernate 或直接 JDBC + c3p0)都可以很好地扩展。不过,我还没有使用过 c3p0,所以我不能肯定地说。此外,Hibernate 不是一个容器,它是一个库。不过,它确实适用于任何体面的 J2EE 容器。
    【解决方案3】:
    • 服务器端是否需要有 GUI 来报告状态、连接性和异常。如果是这样,我该如何实现,我应该使用 Swing 吗?

    不,没必要。异常应该放在日志文件中。当客户请求时,可以在简单的控制台中报告状态。还有连接信息。换句话说,(Swing)GUI 可能很方便,但无论如何你都应该从低级别的东西开始,它是一个低优先级的功能,很高兴拥有。

    • MINA 正在处理连接,但我如何处理数据库 (MySQL)?

    我不知道这个问题是关于数据库连接还是数据库访问。如果是关于数据库访问,取决于您将要执行的操作的复杂性和 OO 性,ORM 可能是个好主意,或者不是,在这种情况下,您可能更喜欢原始 JDBC。没有更多细节,虽然不可能回答。如果是关于数据库连接处理,也许使用像 c3p0 这样的连接池,但忘记 JNDI。

    • 如何测试此应用的可扩展性,如何模拟客户端与服务器的连接。

    为此,正如其他答案中所建议的,JMeter 及其 TCP 采样器将完成这项工作。

    • 是否有任何框架可以完成上述所有工作,或者我必须处理每个方面。

    正如我所说,没有更多细节,就不可能给出更具体或更准确的答案。

    【讨论】:

    • 您还需要哪些其他详细信息?
    • 诸如您的应用程序要做什么、有代表性的用例是什么、您要处理什么数据、处理多少等。
    【解决方案4】:
    • 如果您认为这对您的 申请报告事情 你提到,你可能 应该。您可以将 Swing 用作 GUI。如果 你在网络方面更有经验 发展,你也可以让你的 服务器应用程序写入数据库, 并将其显示在网页上(和 也写另一种方式,通过 数据库)。你做出的选择 应该基于你如何看待你的 应用程序将不断发展。

    • 如果您的数据库操作受到限制,您可以只使用普通的旧 JDBC 库,它将为您提供执行对 MySQL 数据库的写入/读取所需的类。如果您认为您的应用程序的大小/复杂性会在一定程度上增长,您可能需要考虑使用某种ORM(例如 Hibernate)。

    • 我听说 JMeter 是一种在客户端-服务器设置中测试客户端负载的工具。我自己没有试过这个。 JUnit 不会帮助您衡量这一点。

    【讨论】:

    • 将一些日志写入数据库似乎是一个好主意,正如我之前所说的,我以前没有做过这样的事情,所以我需要收集一些信息以保持稳定。您能否推荐一些好的阅读材料来构建可扩展的 Java 服务器端应用程序。此外,由于客户端将通过套接字连接,因此有人建议使用 JNDI 数据源连接池进行数据库连接。我会看看 Hibernate。
    • 这是一个 J2EE(Java 企业版)应用程序吗?还是您使用的是纯 J2SE?
    • 既然我用的是socket我用的是J2SE,你觉得J2EE更适合这种应用吗?
    • 不,不一定。似乎 MINA 负责实现可伸缩性的“困难”部分(线程等..)(J2EE 也这样做)。
    • 我只使用过作为参考实现的 Glassfish (Sun)。在您的情况下使用 J2EE 的唯一原因(根据提供的信息)必须是数据库连接池。您可以搜索“glassfish jndi 连接池”或其他主题。我不知道 J2EE 和 MINA 之间的工作情况如何,但正如我所说,套接字在 J2EE 中也是可能的。我在 Glassfish 中使用了连接池,而且设置起来非常容易。
    【解决方案5】:

    服务器端是否需要有 GUI 来报告状态、连接性和异常。如果是这样,我该如何实现,我应该使用 Swing 吗?

    您不必有 GUI 端,您可以只将日志写入文件,或使用其他日志服务器,例如 windows 事件日志。

    MINA 正在处理连接,但我如何处理数据库(MySQL)

    访问您的 MySQL 数据库的方法有很多,我敢肯定,swing 有一个用于此的框架。您也可以尝试休眠,它类似于 .NET 中的 LINQ,但用于 Java。

    如何测试此应用的可扩展性,如何模拟客户端与服务器的连接。

    你需要一个测试框架,试试 JUnit。

    【讨论】:

    • Apache MINA 已经使用了 SL4J 日志框架就够了吗?我对 Windows 事件日志了解不多。
    • SL4J 非常好。而且由于您正在使用 Java,因此不必为特定于 MS 的事情而烦恼。