Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.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 如何使用classloader将类文件从服务器加载到客户端_Java_Sockets_Classloader_Urlclassloader - Fatal编程技术网

Java 如何使用classloader将类文件从服务器加载到客户端

Java 如何使用classloader将类文件从服务器加载到客户端,java,sockets,classloader,urlclassloader,Java,Sockets,Classloader,Urlclassloader,我有一个nio通道,我的客户机应该从服务器计算机加载一个类文件。它们在相同的IP范围内。我有两个在服务器和客户机上通用的接口。以及在服务器计算机上实现接口的类。我在我的客户机上使用以下代码,但运行时将出现ClassNotFoundException URL url = new URL("file:///E:/Computing/Master/classes/" ); URLClassLoader ucl = new URLClassLoader(new URL[]{url}); Class cl

我有一个nio通道,我的客户机应该从服务器计算机加载一个类文件。它们在相同的IP范围内。我有两个在服务器和客户机上通用的接口。以及在服务器计算机上实现接口的类。我在我的客户机上使用以下代码,但运行时将出现ClassNotFoundException

URL url = new URL("file:///E:/Computing/Master/classes/" );
URLClassLoader ucl = new URLClassLoader(new URL[]{url});
Class clazz = ucl.loadClass("com.counter.controller.Action");
ProcessAlgorithm iAction = (ProcessAlgorithm) clazz.newInstance();

在这种情况下,类加载的完整过程是什么?

我找到了解决方案,希望在这里与大家分享。首先,此作业是网络类加载。可以在javadoc中找到这个名称。 实际上,使用以下代码无法从远程计算机加载类文件:

URL url = new URL("file:///E:/Computing/Master/classes/" );
URLClassLoader ucl = new URLClassLoader(new URL[]{url});
Class clazz = ucl.loadClass("com.counter.controller.Action");
ProcessAlgorithm iAction = (ProcessAlgorithm) clazz.newInstance();
即使您将其URL更改为“http”,而两台单独的计算机之间没有http协议。让我们从正确的方式开始

假设您有两台具有192.168.10.1(服务器)和192.168.10.2(客户端)IP的计算机。有一个类文件,客户端不应将其从服务器磁盘复制到其磁盘。因此,首先,开始在JVM(服务器和客户端)上定义相同的接口。使用与以下界面相同的包:

package org.counter.biz;

public interface ProcessAlgorithm {

    int doProcess() ;

}
所以,这个接口在服务器和客户端上是通用的。其次,应该在服务器上定义主类并实现接口:

package org.counter.biz;

public class Action implements ProcessAlgorithm {

    @Override
    public int doProcess() {

       /* something to do */

    }
}
最后,类文件应该通过套接字或套接字通道发送到客户端。这里,我在服务器上使用Socketchannel,在客户端使用Socketchannel。(实际上,您必须先知道如何通过套接字连接两台远程计算机。)

向客户端发送类文件字节的服务器端代码:

private void sendAlgorithmFile(SocketChannel client, String filePath) throws IOException {

        ByteBuffer buffer = ByteBuffer.allocate(8192);
        buffer.clear();

       /*file path like E:\\classes\\Action.class*/
        Path path = Paths.get(filePath);
        FileChannel fileChannel = FileChannel.open(path);
        int bytes = 0;
        int counter = 0;


        do {
            bytes = fileChannel.read(buffer);
            if (bytes <= 0)
                break;
            counter += bytes;
            buffer.flip();
            do {
                bytes -= client.write(buffer);
            } while (bytes > 0);
            buffer.clear();
        } while (true);


        fileChannel.close();

    }
然后:

然后你可以像这样使用这个类

iAction.doProcess();

如果有任何问题,我会在这里回答。:)

我有个问题。你的问题在哪里你应该在这里问个问题。您确实可以回答自己的问题,但首先您需要问一个问题Java的内置RMI使用这种类分布,因此它可以工作,但我要警告的是,这不太可能是一个好主意。我建议尽可能多地分发数据而不是代码。Sarah,你已经设法问了4个关于Stackoverflow的问题,他们都投了反对票。你真的应该去巡演@Peter Lawrey:我用过RMI,但是你知道,如果你想用socket打开一个频道,你不应该再用RMI打开另一个频道。您好,谢谢,
main()
方法中的
clientSocket
是什么
public class Client {
  public static void main(String[] args) throws Exception{
    MyClassLoader myClassLoader = new MyClassLoader(clientSocket);
    Class clazz = myClassLoader.findClass(null);
    ProcessAlgorithm iAction = (ProcessAlgorithm) clazz.newInstance();
   }
}
iAction.doProcess();