Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/309.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
通过局域网在其他java应用程序上调用方法_Java_Sockets_Lan - Fatal编程技术网

通过局域网在其他java应用程序上调用方法

通过局域网在其他java应用程序上调用方法,java,sockets,lan,Java,Sockets,Lan,我有两个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=

我有两个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(),因此我只想知道如何使客户端应用程序调用此方法(如果可能)

谢谢


@MichalLonski如何向ServerApp显示“obj”

由于是
静态
方法,您必须指向
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);
    }
}
package.com.example;
福班{
公共静态无效条(){
System.out.println(“你好。”);
}
}
公共类服务器应用程序{
公共静态void main(字符串[]args)引发异常{
//从套接字读取类和方法名称
String className=“com.example.Foo”;
String methodName=“bar”;
Class clazz=Class.forName(className);
getMethod(methodName).invoke(clazz);
}
}

可能重复:@MichalLonski如何向服务器应用程序显示“obj”?非常好的观点-但我希望客户端应用程序调用zzz(),而不是服务器应用程序本身-请记住,客户端应用程序和服务器应用程序是两台不同计算机上的两个项目,通过LAN(wifi网络)相互连接)((如何创建“obj”)向服务器应用程序表明我很抱歉我是说客户端应用程序你是什么意思?是否要在客户端应用程序中指定类和方法名称,将这些名称发送到服务器应用程序并在那里执行?是的->看,我可以轻松地将消息从客户端应用程序发送到服务器应用程序,因此如何使客户端应用程序调用(或调用)服务器应用程序中的方法zzz(),从而使方法zzz()在ServerApp内部执行,因为ClientApp会调用它——我知道这是可能的,但不知道如何确切地执行,例如,如果不是以字符串形式发送消息,而是以可执行形式发送消息(当然,消息将是ServerApp中方法的名称,这不是我刚才回答的吗?您将方法和类名(作为字符串消息)从ClientApp发送到ServerApp,后者通过反射执行它。呃。