【问题标题】:calling method on other java application via lan通过局域网在其他java应用程序上调用方法
【发布时间】:2018-04-06 08:15:18
【问题描述】:

我有 2 个 java 应用程序通过 LAN(wifi 网络)相互连接

第一个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 地址通过 LAN 向服务器应用程序发送消息 - 服务器应用程序有一个方法调用 zzz() 所以我想要的是如何让客户端应用程序调用此方法(如果可能的话)

谢谢

【问题讨论】:

标签: java sockets lan


【解决方案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);
    }
}

【讨论】:

  • 非常好的一点 - 但我希望 ClientApp 调用 zzz() 而不是 ServerApp 本身 - 请记住 ClientApp 和 ServerApp 是通过 LAN(wifi 网络)相互连接的两台不同计算机上的 2 个项目
  • ((如何让“obj”指示ServerApp))我很抱歉,我的意思是ClientApp
  • 什么意思?您想在客户端应用程序中指定类和方法名称,将这些名称发送到服务器应用程序并在那里执行吗?
  • 是的,完全正确 -> 看起来我可以轻松地从 ClientApp 向 ServerApp 发送消息,所以我怎样才能让 ClientApp 调用(或调用)ServerApp 中的方法 zzz() 所以方法 zzz () 在 ServerApp 内部执行,因为 ClientApp 调用它——我知道这是可能的,但不知道如何准确地执行它,例如如果——例如——我不是以字符串形式发送消息,而是以可执行形式发送它(当然消息将是 ServerApp 中的方法的名称
  • 我刚才回答的不是这个吗?您将方法和类名(作为字符串消息)从 ClientApp 发送到通过反射执行它的 ServerApp。嗯。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-01-16
  • 1970-01-01
  • 1970-01-01
  • 2013-01-23
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多