通过 RMI 发送存储在 ArrayList 中的数据 [关闭]

Posted

技术标签:

【中文标题】通过 RMI 发送存储在 ArrayList 中的数据 [关闭]【英文标题】:sending data stored inside an ArrayList via RMI [closed] 【发布时间】:2015-07-18 06:32:32 【问题描述】:

如果我希望客户端请求存储在服务器中的 ArrayList 中的文本数据,那么使用 Java RMI 的实现过程将如何?

请提供类图或示例代码。

【问题讨论】:

也就是说如何实现一个RMI应用程序?太宽泛。查找教程。 【参考方案1】:

为服务器和客户端定义一个接口(相同的包名)

package arrayListRMI;

import java.rmi.Remote;
import java.rmi.RemoteException;
import java.util.ArrayList;

public interface IArrayList extends Remote 
    public ArrayList<String> getText()  throws RemoteException;
    public void setText(ArrayList<String> text) throws RemoteException;

定义一个实用程序类Constants.java

package arrayListRMI;

public class Constants     
    public static final String RMI_ID = "***Answer";
    public static final int RMI_PORT = 222 ;   

IArrayList 添加一个实现(在服务器端)

package arrayListRMI;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.ArrayList;


public class ArrayListImpl  extends UnicastRemoteObject implements IArrayList

    private static final long serialVersionUID = 1L;
    private ArrayList<String> text;

    protected ArrayListImpl() throws RemoteException 
        super();
    

    public ArrayList<String> getText() 
        return text;
    

    public void setText(ArrayList<String> text) 
        this.text = text;
    


因此,您可以通过实例化ArrayListImpl 在服务器端实例化ArrayListString(文本)并将其绑定到rmiregistry,以便客户端可以随时请求它。

ArrayList<String> textRequested = new ArrayList<String>();
textRequested.add("example1");
textRequested.add("example2");
ArrayListImpl arrayListToSend = new ArrayListImpl();
arrayListToSend.setText(textRequested);

服务器

package arrayListRMI;

import java.rmi.AlreadyBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.sql.SQLException;


public class Server 
    public static void main(String args[]) throws AlreadyBoundException, SQLException, ClassNotFoundException 

        try 
            ArrayList<String> textRequested = new ArrayList<String>();
            textRequested.add("example1");
            textRequested.add("example2");
            ArrayListImpl arrayListToSend = new ArrayListImpl();
            arrayListToSend.setText(textRequested);
            Registry registry = LocateRegistry.createRegistry(Constants.RMI_PORT);
            registry.bind(Constants.RMI_ID, arrayListToSend);
            System.out.println("Server starts....");
         catch (RemoteException e) 
            e.printStackTrace();
        
    

客户

package arrayListRMI;

import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.util.ArrayList;

public class Client 
    public static void main(String[] args) 
        try 
            Registry registry = LocateRegistry.getRegistry("localhost", Constants.RMI_PORT);
            IArrayList cmp = (IArrayList) registry.lookup(Constants.RMI_ID);
            ArrayList<String> received = cmp.getText();
            System.out.println(received);
         catch (Exception e) 
            System.err.println("Client exception: " + e.toString());
            e.printStackTrace();
        
    

现在运行服务器。你得到这个输出

Server starts....

然后运行客户端。你得到这个输出

[example1, example2]

【讨论】:

非常感谢,但请您解释一下实用程序类 Constants.java 的用途吗? 这只是为了更好地组织您的工作。并通过RMI_ID 使与远程对象的RMI 连接唯一。另外,如果答案对您有帮助,请考虑接受答案并投票。谢谢。 它对你有用吗?在我的 IDE 中,它运行良好。 @AlaaAbuZarifa 是的,它有效,但是我学习它的方式我没有使用你的方式来绑定客户端和服务器..我在服务器类中使用它||=> IArrayList c =新的 ArrayListImpl(); Naming.rebind("rmi://localhost:/MyService", c);` 任何一种方式都是正确的。你可以使用任何你想要的方式。您可以在它们之间进行选择;)

以上是关于通过 RMI 发送存储在 ArrayList 中的数据 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

Jackrabbit Oak:入门并通过 RMI 连接到独立存储库

使用 RMI 在 Java 中的两个服务器之间连接

回调中的 RMI 连接失败检测

通过 Parcelable 发送嵌套 ArrayList 时出现 NullPointerException

基于RMI和Socket的Java聊天软件

java中的Serializable啥用 举例