Вызов метода на другом 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);
}
}