Как использовать Java Processbuilder для выполнения класса из другого класса - PullRequest
1 голос
/ 04 мая 2020

Я студент и довольно новичок в программировании. Я пытаюсь написать проект UDP-сервер-клиент и выполнить сервер, клиент как процессы. Однако я не понимаю, как использовать Processbuilder для этого. Я в значительной степени прошел через тонны связанных тем, но я все еще не могу понять это. Какие параметры я должен передать в этой конкретной программе? Код ниже:

Главный. 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();

    }
}

Клиент. 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);
    }
}

Сервер. 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");


    }
}

И нет ошибки. На консоли ничего не печатать. Спасибо !!

1 Ответ

0 голосов
/ 04 мая 2020

Вы не видите никакого вывода, потому что вы не читаете стандартный вывод ваших процессов из вашего основного класса.

Есть несколько способов сделать это, но давайте для простоты остановимся на методе 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");
        // 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();
    }
}

Теперь, когда вы запустите ваш 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");

Дополнительная литература:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...