Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 向正在运行的进程发送消息_Java - Fatal编程技术网

Java 向正在运行的进程发送消息

Java 向正在运行的进程发送消息,java,Java,我想连接两个程序,但我被卡住了,在谷歌上搜索了所有东西(可能是我做错了什么),所以现在我转向你。 因此结构如下,第一个(我称之为ProgramA)和第二个(我称之为ProgramB)是具有不同任务的不同软件 问题的核心是,我不知道如何通过命令行向ProgramB发送消息。 实际上,我可以通过ProgramA执行ProgramB,当然是这样: Runtime.getRuntime().exec("... ProgramB ..."); 忘了提到程序B也有一个System.in阅读器。 如何使用P

我想连接两个程序,但我被卡住了,在谷歌上搜索了所有东西(可能是我做错了什么),所以现在我转向你。
因此结构如下,第一个(我称之为ProgramA)和第二个(我称之为ProgramB)是具有不同任务的不同软件

问题的核心是,我不知道如何通过命令行向ProgramB发送消息。
实际上,我可以通过ProgramA执行ProgramB,当然是这样:

Runtime.getRuntime().exec("... ProgramB ...");
忘了提到程序B也有一个System.in阅读器。
如何使用ProgramA向ProgramB连续发送消息,从ProgramA开始,通过命令行侦听更多消息

例如:ProgramA->ProgramB(等待传入消息)

现在该怎么做才能将某些内容发送到一个单独运行且像命令行一样工作的程序

执行进程间通信的方法有很多。适合您的场景的一种简单方法是让ProgramA在需要发送消息时写入标准输出(例如,
System.out.println(“某些消息”);
)。然后,让ProgramB执行一个循环,从标准中读取:

while(true) {
    BufferedReader reader = new BufferedReader(new InputStreamReader(System.in));
    String input = reader.readLine();
    // do something with the input
}
只要确保您有一些可以导致循环结束的输入,以便ProgramA可以在需要时使ProgramB很好地关闭

要使用标准输入/输出,您可以从命令行启动两个进程,并将其中一个进程的输出传输到另一个进程,如下所示:

java com.example.ProgramAMainClass | java com.example.ProgramBMainClass
但是,因为看起来您是从ProgramA内部启动ProgramB,所以您可以获取启动进程的输出流并将其写入(而不是标准输出)。请注意,它被称为输出流,因为ProgramA将输出到它,即使从ProgramB的角度来看,它是一个输入流

Process programBProc = Runtime.getRuntime().exec("... ProgramB ...");
Writer writer = new OutputStreamWriter(programBPrice.getOutputStream ());
// and wherever you need to write a message from programA, do this:
writer.write("some message\n"); // make sure you include the newline
在这种情况下,从ProgramB中读取这些消息的操作与上面使用standard in完全相同


请注意,如果需要,可以让ProgramA从ProgramB读取响应。您可以通过在ProgramA中获取进程的输入流,然后从中读取来实现这一点。ProgramB可以使用
System.out.println(“一些响应”)发送响应

传递信息的解决方案是否必须基于命令行?有一些像RMI这样的技术可以让你制作一个倾听应用程序(在你的例子中是ProgramB)和一个交谈应用程序(ProgramA)。RMI可以从基于命令行的应用程序a中使用,但不会使用命令行传递信息。这不是重复。这绝对不是重复,也绝对不是建议的开启。@Szilárd我想你会发现这很有用好,它似乎正在工作,感谢您的时间和帮助。如何将sysout连接到sysin?这是错误的,System.in和System.out是错误的blocking@JarrodRoberson当然,他们正在阻止,但这并不意味着这是一个错误的解决方案。为什么你认为阻止IO在这里是错误的?@RishavKundu这取决于你如何启动第二个进程。我将更新我的答案,使其包含在内,因为这会很有用。可能是指向和/或提及
destroy()