rmi iiop在互联网上 [英] rmi iiop over the internet

查看:150
本文介绍了rmi iiop在互联网上的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试获取Oracle RMI-IIOP示例可以工作,但我在Netbeans中遇到此问题。

I am trying to get the Oracle RMI-IIOP example to work, but I'm having problems doing this in Netbeans.

我的代码如下:

界面

import java.rmi.Remote;
import java.rmi.RemoteException;

public interface HelloInterface extends Remote {
    public void sayHello(String from) throws RemoteException;
}

接口实现

import java.rmi.RemoteException;
import javax.rmi.PortableRemoteObject;

public class HelloImpl extends PortableRemoteObject implements HelloInterface{
    public HelloImpl() throws RemoteException
    {
        super();
    }

    public void sayHello(String from) throws RemoteException
    {
        System.out.println("Hello from " + from + "!!!");
        System.out.flush();
    }
}

服务器主页

import javax.naming.Context;
import javax.naming.InitialContext;

public class HelloServer {

    public static void main(String[] args) {
        try {

            System.setProperty("java.naming.factory.initial", "com.sun.jndi.cosnaming.CNCtxFactory");
            System.setProperty("java.naming.provider.url", "iiop://localhost:1050");
            // Step 1: Instantiate the Hello servant
            HelloImpl helloRef = new HelloImpl();
            // Step 2: Publish the reference in the Naming Service
            // using JNDI API
            Context initialNamingContext = new InitialContext();
            initialNamingContext.rebind("HelloService", helloRef);
            System.out.println("Hello Server: Ready...");
        } catch (Exception e) {
            System.out.println("Trouble: " + e);
            e.printStackTrace();
        }
    }
}

和客户代码

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;

public class HelloRMIIIOPClient {

    public static void main(String[] args) {
        Context ic;
        Object objref;
        HelloInterface hi;
        try {
            ic = new InitialContext();
            System.setProperty("classpath", ".");
            System.setProperty("java.naming.factory.initial", "com.sun.jndi.cosnaming.CNCtxFactory");
            System.setProperty("java.naming.provider.url", "iiop://localhost:1050");
        // STEP 1: Get the Object reference from the Name Service
        // using JNDI call.
            objref = ic.lookup("HelloService");
            System.out.println("Client: Obtained a ref. to Hello server.");
        // STEP 2: Narrow the object reference to the concrete type and
        // invoke the method.
            hi = (HelloInterface) PortableRemoteObject.narrow(
                objref, HelloInterface.class);
            hi.sayHello( " MARS " );

        } catch( Exception e ) {
            System.err.println( "Exception " + e + "Caught" );
            e.printStackTrace( );
            return;
        }
    }
}

我用rmic来生成存根和skels,服务器部分代码工作正常,但当我运行客户端代码时,我得到:

I've used rmic to generate the stubs and skels and the server part of the code works fine, but when I run the client code I get :

Exception javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initialCaught
javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file:  java.naming.factory.initial
        at javax.naming.spi.NamingManager.getInitialContext(NamingManager.java:645)
        at javax.naming.InitialContext.getDefaultInitCtx(InitialContext.java:288)
        at javax.naming.InitialContext.getURLOrDefaultInitCtx(InitialContext.java:325)
        at javax.naming.InitialContext.lookup(InitialContext.java:392)
        at hellormiiiopnew.HelloRMIIIOPClient.main(HelloRMIIIOPClient.java:33)
BUILD SUCCESSFUL (total time: 0 seconds)

虽然这只是为了让我了解它是如何工作的,但最终的代码将被用作模板,因此我可以通过互联网在分布式系统上传输简单对象。我一直试图让RMI在互联网上工作没有成功,所以这是我最近的尝试。我们将非常感激地接受任何帮助,尤其是示例。

Whilst this is just for me to learn how this works the final code will be used as a template, so I can transfer simple objects on a distributed system over the internet. I've been trying to get RMI to work over the internet with no success so this is my latest attempt. Any help and, especially examples, would be gratefully accepted.

推荐答案

您需要在创建 InitialContext之前设置系统属性

这篇关于rmi iiop在互联网上的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆