【问题标题】:Need redirecting output from multi-threaded socket server to other clients.需要将多线程套接字服务器的输出重定向到其他客户端。
【发布时间】:2012-06-12 07:45:11
【问题描述】:

我拥有的是一个监听客户端的多线程套接字服务器。为打开的连接创建并启动新线程。客户端可以通过 Runtime .exec() 方法请求服务器执行一些命令。收到的任何新命令都由新线程处理(将 PrintWriter 作为参数传递),所有输出(std/err)都通过 PrintWriter 通过套接字发送。

问题是,当命令需要更长的时间(即守护程序)并且客户端由于任何原因断开连接时,我无法再获得输出。我需要找到一种从另一个连接上的命令执行线程获取输出的方法(新的客户端会话将在另一个线程上)。

我可以尝试将命令的所有输出发送到 System.out,并尝试使用 PrintWriter 通过套接字发送它(System.out)(我不知道该怎么做)。如果我成功了,也许有一种方法可以将所有这样的输出发送到每个连接的客户端。

但是,我将所有输出保存到数据库中,如果连接了多个客户端,我最终会在我的数据库中有多个输入。

请给我一些想法,让我知道如何解决这个问题。谢谢

【问题讨论】:

  • 我认为创建另一个服务器来监听和存储前多线程服务器的输出可以解决问题。当没有连接时,将输出临时存储在文件中,并在重新连接后重新传输所有内容。这样我就不会丢失任何输出,并且仍然可以使用许多客户端来发出命令。客户端仅显示其连接的输出,不必将其存储在 db 中(以避免重复条目)。

标签: java sockets system.out


【解决方案1】:

您可能希望使您的调用异步。永远不应该同步执行持续时间未知的任务。

我会考虑使用“反应器”类型的服务器(即:每个客户端一个线程 = 快速死亡)并使用某种类型的消息传递机制来处理长时间运行的事务。有很多中间件可以做这种工作,这真的取决于你在什么平台上。

顺便说一句,使用套接字连接在远程机器上执行命令是一个安全漏洞,但你可能已经知道了!

【讨论】:

  • 每个命令都在新线程中执行,对于短时间的执行,线程很快结束。即使连接断开(虽然没有发送输出),持久的命令仍然会执行。通常我会选择 ActiveMQ 或类似的,但在这里我想让它严格基于套接字(直接),可能使用临时散列文件存储)。尽管存在安全漏洞。
  • 好吧,如果你不能/不想使用任何中间件,你必须自己写一个。您必须考虑流是异步的用例,并考虑获取结果的最佳方法,作为您建议的临时存储。无论如何,这比使用成熟的异步任务执行系统成本更高。服务架构不应与用于发布服务本身的技术紧密相关。例如:如果您的系统处理异步任务,那么通过套接字同步调用它们的可能性应该只是一种选择。
【解决方案2】:

那么,您是否考虑过为每个连接使用会话 ID?此 ID 将与每次执行的输出相关联。因此,可以在同一用户的后续调用中检索到相同的输出。暂时可以将输出存储在存储库中(例如数据库、内存、文件)。

如果我没有正确回答您的问题,请纠正我。

【讨论】:

  • 我不需要会话 ID,在我的情况下我想不出它们有什么好处。我需要的是将所有输出(无论哪个客户端启动它)重定向到当前连接的客户端(理想情况下只有一个)的某种方式。假设我之前连接了在服务器机器上启动了几个守护进程的客户端,我需要在客户端上有一些命令(例如“getAllOutput”)将所有输出从服务器重定向到该客户端。当我建立新连接时,我希望可以选择将所有服务器输出到这个连接的客户端。
  • 在没有连接的客户端获取输出时临时存储输出是个好主意
  • 此外,当我决定断开该临时客户端的连接时,我想将输出发送回之前连接的客户端(假设连接仍然存在)。
  • 我明白你的意思。在您的情况下,我会选择即发即弃的 Web 服务来调用执行。然后,我会将输出保存在存储库中(暂时)。最后,会有第二个(同步)Web 服务来获取输出。这符合您的需求吗?
  • 我知道我想要很多。可能我需要重新考虑一切,从头开始设计不同的系统。任何提示。
猜你喜欢
  • 1970-01-01
  • 2015-06-22
  • 2012-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 2016-09-22
相关资源
最近更新 更多