2009-09-28 4 views
0

RMI 응용 프로그램으로 간단한 에코 서버를 작성하려고합니다 (단계별 설명은 Sun 자습서에 설명되어 있음).RMI 서비스 바인딩 중 서버 오류가 발생했습니다

모든 소스 코드는 다음과 같습니다

, 그것은 매우 간단합니다

package test; 

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

public interface EchoServer extends Remote { 
    public String sendString (String str) throws RemoteException;   
} 

package test; 

import java.rmi.server.UnicastRemoteObject; 
import java.rmi.RemoteException; 

public class EchoServerImpl extends UnicastRemoteObject implements EchoServer { 

    public EchoServerImpl() throws RemoteException { 
     super(); 
    } 

    public String sendString (String str) throws RemoteException { 
     return str.toUpperCase(); 
    } 
} 

package test; 

import java.rmi.Naming; 

public class RMIServer { 

    public RMIServer() { 
     try { 
      EchoServer eServer = new EchoServerImpl(); 
      Naming.rebind ("rmi://localhost:1099/EchoService", eServer); // <--exception 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 

    public static void main(String[] args) { 
     new RMIServer(); 
    } 
} 

내가 rmic를 사용하여 코드를 컴파일하고 내가 파일 EchoServerImpl_Stub.class을 참조하십시오. 그 후 나는 rmiregistry를 실행 한 다음 RMIServer를 시작합니다. 나는 그것이 일반적인 문제 그리고 그것은 아마 잘못 배포와 연결 생각

 
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: test.EchoServerImpl_Stub 
    at sun.rmi.server.UnicastServerRef.oldDispatch(Unknown Source) 
    at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source) 
    at sun.rmi.transport.Transport$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Unknown Source) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255) 
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233) 
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:359) 
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source) 
    at java.rmi.Naming.rebind(Naming.java:160) 
    at test.RMIServer.(RMIServer.java:10) 
    at test.RMIServer.main(RMIServer.java:17) 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 
    at java.lang.reflect.Method.invoke(Method.java:597) 
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90) 
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: test.EchoServerImpl_Stub 
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source) 
    at sun.rmi.server.UnicastServerRef.oldDispatch(Unknown Source) 
    at sun.rmi.server.UnicastServerRef.dispatch(Unknown Source) 
    at sun.rmi.transport.Transport$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Unknown Source) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Source) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
    at java.lang.Thread.run(Unknown Source) 
Caused by: java.lang.ClassNotFoundException: test.EchoServerImpl_Stub 
    at java.net.URLClassLoader$1.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClass(Unknown Source) 
    at java.lang.ClassLoader.loadClassInternal(Unknown Source) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Unknown Source) 
    at sun.rmi.server.LoaderHandler.loadClass(Unknown Source) 
    at sun.rmi.server.LoaderHandler.loadClass(Unknown Source) 
    at java.rmi.server.RMIClassLoader$2.loadClass(Unknown Source) 
    at java.rmi.server.RMIClassLoader.loadClass(Unknown Source) 
    at sun.rmi.server.MarshalInputStream.resolveClass(Unknown Source) 
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source) 
    at java.io.ObjectInputStream.readClassDesc(Unknown Source) 
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source) 
    at java.io.ObjectInputStream.readObject0(Unknown Source) 
    at java.io.ObjectInputStream.readObject(Unknown Source) 
    ... 12 more 

: 그리고 그 순간에 나는 ServerException를 참조하십시오. 그것을 고치는 방법?

답변

0

나는 당신의 rmiregistry 클래스 경로라고 생각합니다. test.EchoServer 인터페이스는 rmiregistry 자체에서 액세스 할 수 있어야합니다. rmiregistry을 실행하기 전에 CLASSPATH 환경 변수를 설정하십시오.

C:\>set CLASSPATH="MyBinFolder" 
C:\>rmiregistry 

또한, rmic를 더 이상을 실행하는 데 필요하지 않습니다 자바 5 전에서 숙취입니다. 서버와 클라이언트를 정상적으로 실행하면 프록시가 동적으로 생성됩니다.

감사합니다, MK

+0

그것은 * 당신은 영업 이익이 완료되지 않은'UnicastRemoteObject'의 Javadoc을 전문에 언급 된 조건을 만족하지 않는'rmic'을 실행하는 데 * 필요하다. – EJP

관련 문제