首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Java解决解决问题

Java解决解决问题
EN

Stack Overflow用户
提问于 2012-09-26 15:22:47
回答 2查看 671关注 0票数 0

我正在尝试重新编码一些基本的设计模式。只有我可以使用的代码片段,没有完整的运行代码示例。一种是代理模式。

我只想通过远程开发票的方法。这是我的简单代码:

WebService.java

代码语言:javascript
复制
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

代码语言:javascript
复制
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-附加(即港口转运工程很好)。

EN

回答 2

Stack Overflow用户

发布于 2012-09-26 16:07:48

好的,我猜您的WebService在NAT之后,并且您已经在1099上设置了端口转发以进入RMI注册中心。这还不够。远程对象将挂在与1099不同的端口上监听。如果您不设置端口转发到此端口,您将永远不会连接,因此在double d = service.getRoot(5.0)行的异常。

问题是该往哪个港口前进?如果没有指定端口,RMI将随机选择一个高端口。但是可以通过使用UnicastRemoteObject构造函数的版本来指定端口。因此,您可以选择一个端口号,执行IRemote service = new WebService([portnumber]);并在该端口上设置端口转发。

看看它能不能割断它!

票数 0
EN

Stack Overflow用户

发布于 2012-09-26 19:24:54

我已经解决了一部分问题。它隐藏在服务器存根的逻辑后面:

在服务器端,我们必须通过添加行来添加有关全局主机名的信息。

代码语言:javascript
复制
System.setProperty("java.rmi.server.hostname",Util.getGlobalAddress().getHostAddress());

..。其中,Util类可能类似于:

代码语言:javascript
复制
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;

  }
}

现在它向一个方向工作,即客户端调用,如

代码语言:javascript
复制
service.printName("Pete");

在服务器端工作正常。另一方面..。

代码语言:javascript
复制
d = service.getRoot(5.0);
System.out.println(d);

..。对客户的影响还不起作用。它不会引起错误,但我们没有得到结果。然而。您也可以通过添加客户机ip adress/主机名来修复它:

代码语言:javascript
复制
System.setProperty("java.rmi.client.hostname", "ip.of.client.pc");

但是服务器不可能事先知道所有客户端的信息。无论如何,这是一个解决办法,在某些情况下可能会有所帮助。

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

https://stackoverflow.com/questions/12605112

复制
相关文章

相似问题

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