【发布时间】:2012-09-26 15:22:47
【问题描述】:
我正在尝试重新编写一些基本的设计模式。只有代码 sn-ps 可供我使用,没有完整的运行代码示例。一种叫做代理模式。
我只想通过远程调用方法。这是我的简单代码:
WebService.java
public class WebService extends UnicastRemoteObject implements IRemote {
private static final long serialVersionUID = 1L;
public static void main(String[] args) {
try {
IRemote service = new WebService();
Naming.rebind("RemoteCalculator", service);
} catch (Exception e) {
e.printStackTrace();
}
}
/** No arg default constructor */
public WebService() throws RemoteException { }
/** Methods of remote interface */
@Override
public double getRoot(double v) throws RemoteException {
return Math.sqrt(v);
}
}
... 其中 IRemote 是一个简单的接口,它扩展了远程接口并定义了单个示例方法 (getRoot(double)) 的签名。
现在是连接到远程的类:
TestProxy.java
public class TestProxy implements Remote{
/**
* @param args
*/
public static void main(String[] args) {
new TestProxy().go(args[0]);
}
public TestProxy() {}
public void go(String ip) {
try {
System.out.println("Trying to lookup for service ...");
IRemote service = (IRemote) Naming.lookup("//" + ip + "/RemoteCalculator");
System.out.println("done");
double d = service.getRoot(5.0);
System.out.println(d);
} catch (Exception e) {
e.printStackTrace();
}
}
}
我正在运行 rmiregistry.exe 并通过 rmic.exe 创建了我的 WebService_Stub.class,如一些文档中所示。 本地与 127.0.0.1 连接,因为(ip-)参数工作正常。但是,即使端口(1099)已打开并通过 telnet 进行检查,也无法通过 Internet 连接。
当我从命令行开始时:
java net.mypackage.remote.TestProxy 78.2.2.2
它总是给出结果:
尝试查找服务...完成 java.rmi.ConnectException: 连接拒绝主机:192.168.1.51;嵌套异常是: java.net.ConnectException:连接超时 在 sun.rmi.transport.tcp.TCPEndpoint.newSocket(未知来源) 在 sun.rmi.transport.tcp.TCPChannel.createConnection(未知来源) 在 sun.rmi.transport.tcp.TCPChannel.newConnection(未知来源) 在 sun.rmi.server.UnicastRef.invoke(未知来源) 在 java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unkn 自己的来源) 在 java.rmi.server.RemoteObjectInvocationHandler.invoke(未知来源) 在 $Proxy1.getRoot(未知来源) 在 net.gerdsmeier.remote.TestProxy.go(TestProxy.java:39) 在 net.gerdsmeier.remote.TestProxy.main(TestProxy.java:22) 引起:java.net.ConnectException:连接超时 在 java.net.PlainSocketImpl.socketConnect(本机方法) 在 java.net.AbstractPlainSocketImpl.doConnect(未知来源) 在 java.net.AbstractPlainSocketImpl.connectToAddress(未知来源) 在 java.net.AbstractPlainSocketImpl.connect(未知来源) 在 java.net.SocksSocketImpl.connect(未知来源) 在 java.net.Socket.connect(未知来源) 在 java.net.Socket.connect(未知来源) 在 java.net.Socket.(未知来源) 在 java.net.Socket.(未知来源) 在 sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown S 源) 在 sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown S 源) ... 9 更多
其中 192.168.1.51 是我的本地 IP 地址(即端口转发工作正常)。
【问题讨论】:
-
你能发布整个异常堆栈吗?
-
当然,我添加了剩余的行。
标签: java design-patterns rmi