如何在RMI方法中传递参数中的对象? [英] How to pass object in arguments in RMI method?

查看:83
本文介绍了如何在RMI方法中传递参数中的对象?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试在RMI方法中添加参数。当我添加例如 String 一切正常。但我不确定我是否可以传递我创建的对象。我是RMI的新手,所以我的代码非常简单:

I am trying to add arguments in RMI method. When I add e.g. String everything works fine. But I am not sure if I can pass an object I created. I am new to RMI so my code is very simple:

HelloIF

public interface HelloIF extends Remote {
    String greeting(Context c) throws RemoteException;
}

Hello

public class Hello extends UnicastRemoteObject implements HelloIF {

    public Hello() throws RemoteException {
    }

    public String greeting(Context c) throws RemoteException {
        addToContext(c);
        report(c);
        return "greeting";
    }

    void addToContext(Context c) {
        c.addID(Thread.currentThread().getId());
    }

    void report(Context c) {
        System.out.println("Hello.greeting() thread : "
                + Thread.currentThread().getName() + " "
                + Thread.currentThread().getId());

        System.out.println("Hello.greeting() context : "
                + c.getDistributedThreadName() + " " + c.getRequestType());
    }
}

RMIServer

RMIServer

public class RMIServer {

    public static void main(String[] args) throws RemoteException, MalformedURLException {
        LocateRegistry.createRegistry(1099);
        HelloIF hello = new Hello();
        Naming.rebind("server.Hello", hello);
        System.out.println("server.RMI Server is ready.");
        System.out.println("RMIServer.main() thread : " + Thread.currentThread().getName() 
                + " " + Thread.currentThread().getId());
    }
}

RMIClient

RMIClient

public class RMIClient {
    public static void main(String[] args) throws RemoteException, MalformedURLException, NotBoundException {

        Context context = new Context("request1", Thread.currentThread().getName()+System.currentTimeMillis());

        Registry registry = LocateRegistry.getRegistry("localhost");
        HelloIF hello = (HelloIF) registry.lookup("server.Hello");
        System.out.println(hello.greeting(context));
        System.out.println("RMIClient.mian() thread : " + Thread.currentThread().getName() 
                + " " + Thread.currentThread().getId());
    }
}

最后我的班级上下文

public class Context 
{
    private String requestType;
    private String distributedThreadName;
    private List<Long> IDList;

   (...) getters/setters
}

我该怎么做才能使传递上下文成为可能?

What should I do to make passing Context possible?

推荐答案

您的对象应该实现 Serializable 。我可以看到这将是一个问题。这是必需的,因为两个部分之间的通信是使用序列化完成的,因此需要发送到另一部分的每个对象都需要是实现 Serializable 的类的实例。

Your object should implement Serializable. As I can see this would be one problem. It is needed because the communication between both parts is done using serialization, so each object that needs to be sent to the other part, needs to be an instance of class implementing Serializable.

public class Context implements Serializable
{
    private String requestType;
    private String distributedThreadName;
    private List<Long> IDList;

   (...) getters/setters
}

并且请添加 serialVersionUID 作为一种良好做法。类似于:

and please add a serialVersionUID as a good practice. Something like:

private static final long serialVersionUID = 20120731125400L;

这篇关于如何在RMI方法中传递参数中的对象?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆