我正在尝试重新编码一些基本的设计模式。只有我可以使用的代码片段,没有完整的运行代码示例。一种是代理模式。
我只想通过远程开发票的方法。这是我的简单代码:
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打开和检查的,也没有通过互联网进行连接的方法。
当我从命令行开始时:
java net.mypackage.remote.TestProxy 78.2.2.2
它给出了所有的时间结果:
试图查找服务..。done java.rmi.ConnectException:连接拒绝宿主: 192.168.1.51;嵌套退出是: sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown源代码的连接超时( sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown源),sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown源的连接超时(java.net.ConnectException),sun.rmi.server.UnicastRef.invoke(未知源),java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unkn本体( java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown源)在net.gerdsmeier.remote.TestProxy.go(TestProxy.java:39) at net.gerdsmeier.remote.TestProxy.main(TestProxy.java:22) at $Proxy1.getRoot(未知源),由: java.net.ConnectException:在java.net.AbstractPlainSocketImpl.doConnect的java.net.PlainSocketImpl.socketConnect(原生方法)超时的连接(未知源)在java.net.AbstractPlainSocketImpl.connectToAddress(Unknown源)在java.net.AbstractPlainSocketImpl.connect(Unknown源)在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 ource)在sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown S ource) .9
其中192.168.1.51是我的本地ip-附加(即港口转运工程很好)。
发布于 2012-09-26 16:07:48
好的,我猜您的WebService在NAT之后,并且您已经在1099上设置了端口转发以进入RMI注册中心。这还不够。远程对象将挂在与1099不同的端口上监听。如果您不设置端口转发到此端口,您将永远不会连接,因此在double d = service.getRoot(5.0)行的异常。
问题是该往哪个港口前进?如果没有指定端口,RMI将随机选择一个高端口。但是可以通过使用UnicastRemoteObject构造函数的版本来指定端口。因此,您可以选择一个端口号,执行IRemote service = new WebService([portnumber]);并在该端口上设置端口转发。
看看它能不能割断它!
发布于 2012-09-26 19:24:54
我已经解决了一部分问题。它隐藏在服务器存根的逻辑后面:
在服务器端,我们必须通过添加行来添加有关全局主机名的信息。
System.setProperty("java.rmi.server.hostname",Util.getGlobalAddress().getHostAddress());..。其中,Util类可能类似于:
public class Util{
/**
* Finds this computer's global IP address
*
* @return The global IP address, or null if a problem occurred
*/
public static Inet4Address getGlobalAddress()
{
try
{
URLConnection uc = new URL( "http://vallentinsource.com/globalip.php" ).openConnection();
BufferedReader br = new BufferedReader( new InputStreamReader( uc.getInputStream() ) );
return ( Inet4Address ) InetAddress.getByName( br.readLine() );
}
catch( MalformedURLException e )
{
e.printStackTrace();
}
catch( IOException e )
{
e.printStackTrace();
}
return null;
}
}现在它向一个方向工作,即客户端调用,如
service.printName("Pete");在服务器端工作正常。另一方面..。
d = service.getRoot(5.0);
System.out.println(d);..。对客户的影响还不起作用。它不会引起错误,但我们没有得到结果。然而。您也可以通过添加客户机ip adress/主机名来修复它:
System.setProperty("java.rmi.client.hostname", "ip.of.client.pc");但是服务器不可能事先知道所有客户端的信息。无论如何,这是一个解决办法,在某些情况下可能会有所帮助。
https://stackoverflow.com/questions/12605112
复制相似问题