我所拥有的是一个监听客户端的多线程套接字服务器。为打开的连接创建并启动新线程。客户端可以通过Runtime .exec()方法请求服务器执行某些命令。收到的任何新命令都由新线程处理(PrintWriter作为参数传递),并且所有输出(std / err)都通过PrintWriter在套接字上发送。
问题是当命令花费更长时间(即守护进程)并且客户端由于任何原因而断开连接时,我再也无法获得输出。我需要找到一种方法从另一个连接上获取该命令执行线程的输出(新客户端会话将在另一个线程上)。
我可以尝试将命令的所有输出发送到System.out并尝试使用PrintWriter通过套接字发送它(System.out)(我不知道如何执行此操作)。如果我成功了,也许有办法将所有这样的输出发送给每个连接的客户端。
但是,我将所有输出保存到数据库中,如果连接了多个客户端,我的数据库中最终会有多个输入。
请告诉我一些关于如何解决这个问题的想法。感谢
答案 0 :(得分:1)
您可能希望异步调用。执行未知持续时间的任务绝不应同步进行。
我会考虑使用“reactor”类型的服务器(即:每个客户端一个线程=快速死亡)并使用某种类型的消息传递机制来进行长时间运行的事务。有很多中间件可以做这种工作,它实际上取决于你所使用的平台。
顺便说一句,使用套接字连接在远程计算机上执行命令是一个安全漏洞,但您可能已经知道了!
答案 1 :(得分:0)
那么,您是否考虑为每个连接使用会话ID?此ID将与每次执行的输出相关联。因此,可以在来自同一用户的后续调用中检索相同的输出。暂时,输出可以存储在存储库(例如DB,内存,文件)中。
如果我没有正确回答您的问题,请纠正我。