java - 如何创建一个一次只接受一个连接的 rmi 服务器?

标签 java rmi

我正在使用 rmi java 在 java 中编写客户端-服务器对。我希望服务器监听连接,当一个客户端连接时,服务器应拒绝任何其他尝试连接的客户端。

最佳答案

您需要使用 http://download.oracle.com/javase/6/docs/api/java/rmi/registry/LocateRegistry.html#createRegistry%28int,%20java.rmi.server.RMIClientSocketFactory,%20java.rmi.server.RMIServerSocketFactory%29 在代码中启动 RMI 注册表, 并写一个自定义 RMIServerSocketFactory返回仅接受单个连接的 ServerSocket。

编辑:与 LocateRegistry.createRegistry 的混搭和 http://download.oracle.com/javase/1.5.0/docs/guide/rmi/hello/Server.java添加了一些额外的代码(请注意,我没有编译它,因此您需要自己解决所有编译错误;它旨在向您展示一般用法):

编辑 2:修复它以纳入@EJP 的建议(有关详细信息,请参阅 this)。

import java.rmi.registry.Registry;
import java.rmi.registry.LocateRegistry;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

public class Server implements Hello {

    public Server() {}

    public String sayHello() {
    return "Hello, world!";
    }

    public static void main(String args[]) {

    try {
        Server obj = new Server();
        RMIClientSocketFactory csf = new RMIClientSocketFactory() {
            @Override
            public Socket createSocket(String host, int port) throws IOException {
                InetAddress addr = InetAddress.getByName(host);
                if (addr.equals(InetAddress.getLocalHost())) {
                    return new Socket(addr, port);
                } else {
                    throw new IOException("remote socket bind forbidden.");
                }
            }
        };
        RMIServerSocketFactory ssf = new RMIServerSocketFactory() {
            @Override
            public ServerSocket createServerSocket(int port) throws IOException {
                System.out.println("RMIServerSocketFactory().createServerSocket()");
                return new ServerSocket(port, 1, InetAddress.getByName("127.0.0.1"));
            }
        };
        Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0, csf, ssf);

        // Bind the remote object's stub in the registry
        Registry registry = LocateRegistry.createRegistry(uri.getPort(), csf, ssf);

        registry.bind("Hello", stub);

        System.err.println("Server ready");
    } catch (Exception e) {
        System.err.println("Server exception: " + e.toString());
        e.printStackTrace();
    }
    }
}

关于java - 如何创建一个一次只接受一个连接的 rmi 服务器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6393504/

相关文章:

java - JDK 的主目录是什么?

Java RMI 客户端遇到 ClassCastException

Java RMI 连接被拒绝

java - 从 SQLite 过滤记录以显示在列表中

java - Autowiring 依赖项注入(inject)失败;嵌套异常是 org.springframework.beans.factory.BeanCreationException 如何解决它

java - 使用 RMI 进行 Spring 依赖注入(inject)

java - 运行rmi程序时如何解决java.security.AccessControlException问题?

java - Java分布式计算,应用服务器的选择

java - 如何使 IntArrayBag 通用?

java - apache Spark Streaming textFileStream - 读取 gzip 文件