我试图使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(); } }
服务器主
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)
虽然这只是我的学习方法,但最终代码将用作模板,因此我可以通过Internet在分布式系统上传输简单对象。我一直在尝试使RMI在Internet上无法成功运行,因此这是我的最新尝试。任何帮助,尤其是示例,将不胜感激。
您需要先设置系统属性, 然后才能 创建InitialContext.
InitialContext.