首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java RMI实现

Java RMI实现
EN

Stack Overflow用户
提问于 2016-09-12 16:55:24
回答 2查看 856关注 0票数 1

我有一个典型的客户端&服务器场景,我希望客户端能够从服务器上运行的对象调用方法。我使用Java RMI来解决这种情况。

服务器端代码如下,可以很好地编译和运行:

ServerInt.java

代码语言:javascript
复制
package gpio.control;
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface ServerInt extends Remote{
    public void setHeizung(boolean x) throws RemoteException;
    public void quitError() throws RemoteException;
    public void startPWM(int periode,int pulsbreite,int pulsanzahl) throws RemoteException;
}

ServerImpl.java

代码语言:javascript
复制
package gpio.control;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.RemoteServer;
import java.rmi.server.UnicastRemoteObject;

public class ServerImpl implements ServerInt{
    private Model myModel;

    public ServerImpl(Model m) throws RemoteException {
        myModel = m;

        LocateRegistry.createRegistry(1099);
        ServerInt stub = (ServerInt) UnicastRemoteObject.exportObject(this, 1099);
        RemoteServer.setLog(System.out);

        Registry registry = LocateRegistry.getRegistry();
        registry.rebind("Server1", stub);
    }

    @Override
    public void setHeizung(boolean x) throws RemoteException {
        myModel.setHeizung(x);
    }

    @Override
    public void quitError() throws RemoteException {
        myModel.quitError();
    }

    @Override
    public void startPWM(int periode, int pulsbreite, int pulsanzahl) throws RemoteException {
        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
    }
}

出于测试目的,我还创建了一个小型客户端应用程序,它与服务器应用程序运行在同一台服务器上:

Client.java

代码语言:javascript
复制
package client;

import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Client {

    public static void main(String[] args) throws RemoteException, NotBoundException {
        Registry registry = LocateRegistry.getRegistry();
        ServerInt serverint = (ServerInt) registry.lookup("rmi://127.0.0.1:1099/Server1"); 
        serverint.setHeizung(true);
    }

}

当我现在运行客户端程序时,我得到了以下错误: Error from Client:

代码语言:javascript
复制
Exception in thread "main" java.rmi.NotBoundException: rmi://localhost:1099/Server1
    at sun.rmi.registry.RegistryImpl.lookup(RegistryImpl.java:166)
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:410)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:268)
    at sun.rmi.transport.Transport$1.run(Transport.java:200)
    at sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$241(TCPTransport.java:683)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:276)
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:253)
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:379)
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
    at client.Client.main(Client.java:12)

来自服务器的错误:

代码语言:javascript
复制
Sep 07, 2016 9:47:04 AM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(1)-127.0.0.1: [127.0.0.1: sun.rmi.registry.RegistryImpl[0:0:0, 0]: void rebind(java.lang.String, java.rmi.Remote)]
Sep 07, 2016 9:47:04 AM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(2)-127.0.0.1: [127.0.0.1: sun.rmi.transport.DGCImpl[0:0:0, 2]: java.rmi.dgc.Lease dirty(java.rmi.server.ObjID[], long, java.rmi.dgc.Lease)]
Sep 07, 2016 9:47:05 AM sun.rmi.server.UnicastServerRef logCall
FINER: RMI TCP Connection(3)-127.0.0.1: [127.0.0.1: sun.rmi.registry.RegistryImpl[0:0:0, 0]: java.rmi.Remote lookup(java.lang.String)]
Sep 07, 2016 9:47:05 AM sun.rmi.server.UnicastServerRef logCallException
FINE: RMI TCP Connection(3)-127.0.0.1: [127.0.0.1] exception:
java.rmi.NotBoundException: rmi://localhost:1099/Server1
    at sun.rmi.registry.RegistryImpl.lookup(RegistryImpl.java:166)
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source)
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:410)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:268)
    at sun.rmi.transport.Transport$1.run(Transport.java:200)
    at sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$241(TCPTransport.java:683)
    at java.security.AccessController.doPrivileged(Native Method)
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

我在这里做错了什么?

EN

回答 2

Stack Overflow用户

发布于 2016-09-12 17:22:40

在Client.java中更改

代码语言:javascript
复制
registry.lookup("rmi://127.0.0.1:1099/Server1")

代码语言:javascript
复制
registry.lookup("Server1");
票数 1
EN

Stack Overflow用户

发布于 2016-09-12 17:59:16

由于使用Registry而不是Naming进行查找,因此应该省略查找字符串的URL部分,就像绑定时所做的那样。您应该只查找Server1,就像在绑定时所做的那样。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39446583

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档