我在网上上网

  • 本文关键字: java rmi iiop
  • 更新时间 :
  • 英文 :


我试图让Oracle RMI-IIOP示例工作,但我在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();
    }
}

Server Main

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来生成存根和技能,代码的服务器部分工作正常,但是当我运行客户端代码时,我得到:

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在互联网上工作,但没有成功,所以这是我最新的尝试。任何帮助,特别是例子,将不胜感激地接受。

在创建InitialContext.

之前需要设置系统属性

相关内容

  • 没有找到相关文章

最新更新