Вызов метода на другом Java-приложении через LAN

У меня есть 2 Java-приложения, подключенные друг к другу через локальную сеть (Wi-Fi сеть)

первый ServerApp.java

public class ServerApp {

public static void zzz(){
    System.out.println("hi");
}

public static void main(String[] args) {
    try {
        ServerSocket ss=new ServerSocket(6666);
        Socket s=ss.accept();
        DataInputStream dis = new DataInputStream(s.getInputStream());
        String str =(String)dis.readUTF();
        System.out.print("message : "+str);
        ss.close();
    } catch (IOException e) {
        System.out.println(e);
    }
}
}

второй ClientApp.java

public class ClientApp {

public static void main(String[] args) {
    try {
        Scanner in = new Scanner(System.in);
        System.out.print("send message to the server ?[y/n]:");
        String inputString=in.next();
        if ("y".equals(inputString)) {
            Socket s= new Socket("192.168.20.125", 6666);
            DataOutputStream dout=new DataOutputStream(s.getOutputStream());
            dout.writeUTF("hellow server\n");
            dout.writeUTF("zzz");
            dout.flush();
            dout.close();
            s.close();
        } else if ("n".equals(inputString)) {
            System.out.println("exit");
        } else {
            System.out.println("error: you should enter a valid value");
        }
    } catch (IOException e) {
        System.out.println(e);
    }
}
}

что происходит, клиентское приложение отправляет сообщение серверному приложению через локальную сеть, используя IP-адрес сервера - у серверного приложения есть вызов метода zzz(), поэтому все, что мне нужно, это как заставить клиентское приложение вызывать этот метод (если это возможно))

Спасибо

1 ответ

Решение

@MichalLonski, как мне сделать, чтобы "obj" указывало на ServerApp

Как оно есть static метод, который вы должны указать ServerApp.classкак показано ниже:

public class ServerApp {

    public static void zzz() {
        System.out.println("hi");
    }

    public static void main(String[] args) throws Exception {
        String methodName = "zzz";

        java.lang.reflect.Method method = ServerApp.class.getMethod(methodName);
        method.invoke(ServerApp.class);
    }
}

Вы можете изменить его, чтобы использовать не статические, а методы экземпляра. Для этого вам нужно создать экземпляр класса ServerApp, например:

public class ServerApp {

    public void foo() {
        System.out.println("Hello there from non static method!");
    }

    public static void main(String[] args) throws Exception {
        String methodName = "foo";

        ServerApp app = new ServerApp();
        java.lang.reflect.Method method = app.getClass().getMethod(methodName);
        method.invoke(app);
    }
}

Редактировать:

Если вы также хотите указать класс какого метода вы хотите вызвать, вы можете сделать это следующим образом:

package com.example;

class Foo {

    public static void bar() {
        System.out.println("Hello there.");
    }
}

public class ServerApp {

    public static void main(String[] args) throws Exception {
        //read the class and method name from the socket
        String className = "com.example.Foo";
        String methodName = "bar";

        Class<?> clazz = Class.forName(className);
        clazz.getMethod(methodName).invoke(clazz);
    }
}
Другие вопросы по тегам