从 Java Web 应用程序控制 C 应用程序

2024-03-10

我有 C 应用程序将在不同站点的多台计算机上运行。

现在我想控制和监视这些C应用程序。为此,我正在考虑使用 Servlet/JSP 的 Java Web 应用程序。

我认为 C 应用程序将通过 TCP 连接到 Java Web 应用程序。在我的 Web 应用程序中,我正在考虑实现通过 TCP 与 C 应用程序通信的管理器。当 Web 应用程序作为单独的线程启动时,我将启动管理器。管理器将通过 Context 和 Session 与 servlet 请求进行通信。因此,每当用户在浏览器上执行某些操作时,我想在服务器上使用我的管理器的功能,并使用 ServetContext 和 Session 作为接口。

这就是我的想法。所以,我想知道是否有更好的方法,或者我做错了什么?有人可以建议我更好的解决方案吗?

EDIT

当前的工作流程:每当我需要启动/停止 C 应用程序时,我都必须通过 SSH 远程计算机 puTTY 终端,输入长命令,然后启动/停止它。每当出现问题时,我都必须滚动很长很长的日志文件。还有其他一些事情,例如应用程序每秒正在执行/处理所有事情的实时状态,我无法始终将其记录在日志文件中。

所以我发现这些工作流程很困难。我无法监控诸如实时状态之类的事情。

现在我想要一个网络应用程序接口。我可以修改我的 C 应用程序并从头开始实现 Web 应用程序。

要实施的新工作流程:我想从网页启动/停止 C 应用程序。我想在网页上查看日志和实时状态报告/实时图表(监控 C 应用程序正在做什么)。我想在网页上监控机器状态。

我想使用 JSP/servlet 在 Java 中设计 Web 界面。

因此,我将修改我的 C 应用程序,以便它可以与 Web 应用程序进行通信。

问题:

只需要制定新工作流程的指南/最佳实践。

EDIT 2

很抱歉造成混淆控制器 or manager。两者是同一件事。

我的想法: 系统将由运行在不同站点的 C 应用程序、在 Tomcat 服务器中并行运行的 Java 控制器和 Java Web 应用程序以及数据库组成。

1) C 应用程序将通过 TCP 连接到控制器。因此,这里的控制器成为服务器和 C 应用程序客户端。

2) C 应用程序将是多线程的,将从控制器接收任务并生成新线程来执行该任务。当控制器告诉停止任务时,C 应用程序将停止该任务的线程。此外,C 应用程序将发送工作进度(日志)每一秒至控制器。

3)控制器从Web应用程序接收任务命令(两者在Tomcat服务器中并行运行,都在JVM上的同一实例中),并且Web应用程序将通过HTTP接收来自用户的命令。

4)每秒从C应用程序接收到控制器的工作进度(日志),控制器然后将日志插入数据库中以供以后分析(需要考虑MySQL RDBMS中的插入日志是否良好,可能需要进行大量插入,可能是每秒 100 或 1000,永远)。 Web 应用程序还可以从控制器请求最近 5 分钟的日志并通过 HTTP 发送给用户。如果用户正在监视日志,则 Web 应用程序必须每秒从控制器检索日志并通过 HTTP 发送给用户。

5)用户监控C应用程序任务,将在图表中看到每秒更新的进度。另外,C 应用程序中可能偶尔发生的信息/错误事件日志的文本行。

6) C 应用程序将在每台机器上运行,它将执行用户从 Web 浏览器发送的任何任务。 C 应用程序将作为机器中的服务运行,它将在机器启动时启动,将连接到服务器,并将永远保持与服务器的连接。如果没有任务要执行,则可以空闲运行。


这是一种有效的方法,我相信套接字是大多数分布式系统通信的方式,甚至同一个盒子上的不同服务也常常以这种方式进行通信。另外,我相信您对 java web 服务的建议是非常典型的,并且会很好地工作(它的复杂性可能会超出您目前的想法,但您描述的架构是一个好的开始)。

如果您的 C 服务也被设计为独立于管理系统运行,那么您可能需要反转它并使管理系统连接到服务(除非您的防火墙阻止它)。

您肯定需要一个小型的、定义明确的协议。如果您要发送大量字段,您甚至可以将发送的所有内容都设置为 JSON 或 xml,因为它们已经有解析器来验证格式。

注意安全!在 C 方面,确保不会出现任何缓冲区溢出,并且如果您自己解析信息,请严格丢弃(并记录!)看起来不正确的数据。在 Java 上,缓冲区溢出并不是什么大问题,但请确保记录不完全符合协议的数据包,以检测错误和入侵。

您可能会考虑的另一个解决方案 - 您的系统都共享一个数据库,您已经可以通过数据库发送命令和响应(假设命令/响应不会经常发生)。我们并没有完全做到这一点,但我们共享一个变量表,在其中放置名称/值对,指示系统性能和配置的不同方面(它是双向的),这可能不是最佳的,但非常灵活,因为它允许我们在运行时重新配置系统(这些值在每个服务中本地缓存,并且每 30 秒重新读取/更新一次)。

如果我知道有关您期望执行的操作的更多细节,我也许可以为您提供更多信息 - 例如,您的浏览器更新其字段的频率,将发送什么样的命令信号或数据请求以及什么样的数据你期待回来吗?尽管您当然不必在此处发布这些内容,但您必须考虑它 - 我建议首先模拟您的浏览器页面。


根据评论进行编辑: 听起来不错,只是几点评论:

2) 任何好的数据库都应该能够处理日志记录的数据量,但您可能希望在数据库之上使用良好的缓存。

5) 您可能需要一个 Web 框架来呈现图形并管理更新。有很多而且大多数都可以很容易地完成你所说的事情,但是在没有某种框架的情况下尝试自己完成这一切可能会很困难。我这么说只是因为你没有提到。

6) 确保您可以处理断开的连接和重新连接。测试时,拔掉服务器的插头(至少拔掉网线)并保持 10 分钟,然后确保重新插入时得到预期的结果(客户端是否应该自动重新连接?是否应该)抓住原木还是扔掉它们?它能保留原木多久?)

您可能希望以某种方式构建“重新启动”您的 C 服务。由于它们是作为服务启动的,因此只需发送一个告诉它们终止/退出的命令通常就可以工作,因为系统将重新启动它们。您可能还需要一个小的监视循环,可以在某些条件下重新启动它们(例如它们在 n 分钟内没有从服务器收到命令)。当您上午 10 点在加利福尼亚州尝试凌晨 2 点在澳大利亚使用 C 服务时,这会派上用场。

另外,请考虑攻击者可以将自己插入到您的客户端和服务器之间。如果您使用的是 SSL 套接字,您应该没问题,但如果它是原始套接字,您必须非常小心。


更正:

将这么多记录放入 MySQL 数据库时可能会遇到问题。如果它没有被索引并且你最小化针对它的查询,你可能没问题。您可以通过将所有日志的最后 5 分钟保留在内存中来实现此目的,这样您就不必为数据库建立索引,并通过对插入进行分组或拥有经过良好调整的缓存。

更好的方法可能是放弃数据库,而只使用预先过滤为单个用户可能想要查看的内容的平面日志文件,因此,如果用户请求来自计算机的最后 5 分钟“WARN”和“DEBUG”消息,可以将日志文件从该机器读取到内存中,跳过除警告/调试消息之外的所有消息,并显示这些消息。这有其自身的问题,但应该比索引数据库更具可扩展性。这还允许您压缩较旧的数据(用户不想再查询这些数据),从而节省 70-90% 的磁盘空间。

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

从 Java Web 应用程序控制 C 应用程序 的相关文章

  • async wait 在调用异步方法时返回 Task> 而不是 List

    我正在尝试了解 async wait 的用法 并且研究了一些博客文章 现在我已经编写了一个测试代码 但它没有按照我期望的方式工作 我有一个返回列表的方法 private List
  • 删除 ArrayList 对象问题

    我在处理作业时遇到从 ArrayList 中删除对象的问题 如果我使用 正常 for 循环 它的工作原理如下 public void returnBook String isbn for int i 0 i lt booksBorrowed
  • 如何在 Java 中创建要打印到 JFrame 的 JLabels 数组

    我正在尝试制作一系列标签 每个标签都有一个来自函数的不同值 我不知道要使用的标签的确切数量 我的意思是可以打印任意数量的值 请帮我做这件事 很简单 只需一个方法返回一个数组或一些 JLabels 集合 并将它们全部添加到您的 JCompon
  • 如何防止字符串被截留

    我的理解 可能是错误的 是 在 C 中 当你创建一个字符串时 它会被实习到 实习生池 中 这保留了对字符串的引用 以便多个相同的字符串可以共享操作内存 但是 我正在处理很多很可能是唯一的字符串 一旦完成每个字符串 我需要将它们从操作内存中完
  • 为什么 RMI 注册表忽略 java.rmi.server.codebase 属性

    我正在运行 java RMI 的 Hello World 示例 1 我在空文件夹中运行注册表 motta motta laptop tmp rmiregistry 2 我启动 HTTP 服务器以在运行时检索类 下载文件夹包含客户端 服务器的
  • 如何附加到 xml

    我有这个xml
  • Create CFrameWnd 给出了第一次机会异常——为什么?

    我正在尝试使用基于 CFrameWnd 的代码编写一个简单的 MFC 应用程序 该应用程序在可滚动窗口中绘制 下面的代码改编自 Prosise Programming Windows with MFC 第 2 版 第 89ff 页 当我在调
  • setKeyListener 将覆盖 setInputType 并更改键盘

    大家好 我在两个设备之间遇到问题 在实践中使用InputType和KeyListener我正在操纵一个EditText让它从数字键盘接收逗号和数字 有关更多背景信息 请检查我之前的question https stackoverflow c
  • 简单的文档管理系统和API [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Java 8根据Map属性过滤Map对象列表以删除一些重复项

    Have a List
  • 如何使用 libpq 获取双精度值?

    The examples http www postgresql org docs 9 3 interactive libpq example htmllibpq 文档中展示了如何通过将整数值转换为主机字节序表示来获取整数值 我很好奇必须做
  • java中wav文件转换为字节数组

    我的项目是 阿塞拜疆语音的语音识别 我必须编写一个程序来转换wav文件到字节数组 如何将音频文件转换为byte 基本上如第一个答案中的片段所描述 但不是BufferedInputStream use AudioSystem getAudio
  • JPA - 非主键字段上的 @OneToOne 关系不起作用

    我有一个 Spring Data JPA 后端 使用 Hibernate 作为 ORM 实现 这是模型 Person MailConfig id PK uid PK FK Person uid uid Entity
  • win32 API 和 .NET 框架之间的选择

    我必须开发一个适用于 Windows 的应用程序 该应用程序将能够通过网络摄像头识别手势来控制鼠标 我将使用 vc 2008 进行开发 但我很困惑是使用 NET 框架还是核心 win32 API 性能对于我的应用程序非常重要 根据 Ivor
  • 使用 roslyn 扩展 C# 语法

    我试图在没有 else 情况的情况下实现 return if return value if 因为我只想在条件有效时返回或返回一个值 我知道 有if condition return or if condition return value
  • 如何将 Metro 应用部署到桌面?

    我正在尝试将我的 C 应用程序部署到我的 Windows 8 Metro 桌面 我可以在 bin 文件夹中看到部署的文件 但是当我尝试打开它们时 出现以下错误 该应用程序只能在 AppContainer 的上下文中运行 我检查了属性上下文菜
  • 将小数格式化为两位或整数

    对于 10 我想要 10 而不是 10 00 对于 10 11 我想要 10 11 没有代码可以实现吗 即通过指定格式字符串类似于 0 N2 decimal num 10 11M Console WriteLine num ToString
  • Java:基于 Web 的应用程序中的单例类实例

    我在 Web Application 中有这个 Singleton 类 public class MyDAO private static MyDAO instance private MyDAO public static MyDAO g
  • 在类中使用 std::chrono::high_resolution_clock 播种 std::mt19937 的正确方法是什么?

    首先 大家好 这是我在这里提出的第一个问题 所以我希望我没有搞砸 在写这篇文章之前我用谷歌搜索了很多 我对编码 C 很陌生 我正在自学 考虑到有人告诉我 只为任何随机引擎播种一次是一个很好的做法 我在这里可能是错的 什么是正确 最佳 更有效
  • 什么时候使用静态库需要头文件?

    如果我在 Linux 中用 C 创建一个静态库并生成 a 文件 我 或其他人 如何使用该库 例如 我的库定义了一个类 我认为仅仅提供 a 文件是不够的 还需要提供头文件 我如何知道 a 文件必须提供哪些头文件 例如 我是否需要提供我的库代码

随机推荐