英文:
How to use Java Processbuilder to execute a class from another class
问题
以下是翻译好的部分:
Main.java
package praktikum;
import java.io.IOException;
public class main {
public static void main(String[] args) throws IOException {
ProcessBuilder pb1 = new ProcessBuilder("java", "-cp", ".", "praktikum.Server");
ProcessBuilder pb2 = new ProcessBuilder("java", "-cp", ".", "praktikum.Client");
Process p1 = pb1.start();
Process p2 = pb2.start();
}
}
Client.java
package praktikum;
import java.io.IOException;
import java.net.*;
import java.util.Random;
public class Client {
public static void main(String[] args) throws IOException {
String test = "This Work!";
DatagramSocket ds = new DatagramSocket();
int port = 1234;
InetAddress ia = InetAddress.getLocalHost();
byte[] data = new byte[1024];
data = test.getBytes();
DatagramPacket dp = new DatagramPacket(data, data.length, ia, port);
ds.send(dp);
}
}
Server.java
package praktikum;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Server {
public static void main(String[] args) throws IOException {
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
DatagramSocket ds = new DatagramSocket(1234);
ds.receive(dp);
String str = new String(dp.getData(), 0, dp.getLength());
String ipAddress = String.valueOf(dp.getAddress());
int port = dp.getPort();
System.out.println("Server-> IP: " + ipAddress + " | Port: " + port + " | Information: " + str + "\n");
}
}
以上为翻译好的代码部分。
英文:
I am a student and pretty a novice in coding. I am trying to write a UDP-Server-Client project and execute Server, Client as Processes . However i don't understand how to use the Processbuilder to do that.
I am pretty much went through tons of related topics but i still can't understand it. Which parameters should i pass in in this particular Program ?
Code below:
Main.java
package praktikum;
import java.io.IOException;
public class main {
public static void main(String[] args) throws IOException {
ProcessBuilder pb1 = new ProcessBuilder("java", "-cp", ".","praktikum.Server");
ProcessBuilder pb2 = new ProcessBuilder("java", "-cp", ".","praktikum.Client");
Process p1 = pb1.start();
Process p2 = pb2.start();
}
}
Client.java
package praktikum;
import java.io.IOException;
import java.net.*;
import java.util.Random;
public class Client {
public static void main(String[] args) throws IOException {
String test = "This Work !";
DatagramSocket ds = new DatagramSocket();
int port = 1234;
InetAddress ia = InetAddress.getLocalHost();
byte[] data = new byte[1024];
data = test.getBytes();
DatagramPacket dp= new DatagramPacket(data,data.length,ia, port);
ds.send(dp);
}
}
Server.java
package praktikum;
import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;
public class Server {
public static void main(String[] args) throws IOException {
byte[] buf = new byte[1024];
DatagramPacket dp = new DatagramPacket(buf, buf.length);
DatagramSocket ds = new DatagramSocket(1234);
ds.receive(dp);
String str =new String(dp.getData(),0,dp.getLength());
String ipAddress = String.valueOf(dp.getAddress());
int port = dp.getPort();
System.out.println("Server-> IP : " + ipAddress + " | Port : " + port + " | Information : " + str + "\n");
}
}
And there is no error. The console print out nothing.
Thanks !!
答案1
得分: 0
你看不到任何输出,因为你没有从你的 Main 类中读取进程的标准输出。
有几种方法可以做到这一点,但为了简单起见,我们将使用 ProcessBuilder
的 inheritIO()
方法。
package praktikum;
import java.io.IOException;
public class Main
{
public static void main(String[] args) throws IOException
{
ProcessBuilder pb1 = new ProcessBuilder("java", "-cp", ".", "praktikum.Server");
// 这将确保子进程 pb1 的标准输入和输出与这个进程 (Main.java) 相同
pb1.inheritIO();
ProcessBuilder pb2 = new ProcessBuilder("java", "-cp", ".", "praktikum.Client");
// 这将确保子进程 pb2 的标准输入和输出与这个进程 (Main.java) 相同
pb2.inheritIO();
pb1.start();
pb2.start();
}
}
现在,当你运行 Main.java 时,你将能够看到子进程打印出的输出/错误信息。如果你看到以下错误:
Error: Could not find or load main class praktikum.Client
Error: Could not find or load main class praktikum.Server
作为解决方法,我建议传递绝对路径给 ProcessBuilder,而不是使用 '. '
,特别是如果你是从 IDE 中运行的:
new ProcessBuilder("java", "-cp", "/path/to/package", "praktikum.Server");
进一步阅读:
-
Javadoc 有关 ProcessBuilder 的 inheritIO()
-
Baeldung 的指南 关于 ProcessBuilder API
-
使用 ProcessBuilder API 的一些 示例代码
英文:
You don't see any output because you are not reading the standard output of your processes from your Main class.
There are several ways to do it but let's stick to ProcessBuilder
's inheritIO()
method for the sake of simplicity.
package praktikum;
import java.io.IOException;
public class Main
{
public static void main(String[] args) throws IOException
{
ProcessBuilder pb1 = new ProcessBuilder("java", "-cp", ".", "praktikum.Server");
// This will make sure the standard input and output of your subprocess pb1
// are the same as this process (Main.java)
pb1.inheritIO();
ProcessBuilder pb2 = new ProcessBuilder("java", "-cp", ".", "praktikum.Client");
// This will make sure the standard input and output of your subprocess pb2
// are the same as this process (Main.java)
pb2.inheritIO();
pb1.start();
pb2.start();
}
}
Now, when you run your Main.java, you'll be able to see what output/errors your subprocesses are printing. If you see the errors below:
Error: Could not find or load main class praktikum.Client
Error: Could not find or load main class praktikum.Server
as a workaround, I'd advice to pass the absolute path to the ProcessBuilder instead of '.'
especially if you are running from an IDE:
new ProcessBuilder("java", "-cp", "/path/to/package", "praktikum.Server");
Further reading:
-
Javadoc for ProcessBuilder's inheritIO()
-
Baeldung's guide to ProcessBuilder API
-
Some example code using the ProcessBuilder API
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论