2012-10-30 3 views
-1

가능한 중복 :자바 RMI 서버와 목표 - C 클라이언트

이 원격 인터페이스 :


Java RMI server and Objective C client

당신이 RMI에 다음과 같은 한 가정

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

    public interface Hello extends Remote 
    { 
     String sayHello() throws RemoteException; 
    } 

t 은 (는 인터페이스를 구현)

import java.rmi.registry.Registry; 
    import java.rmi.registry.LocateRegistry; 
    import java.rmi.RemoteException; 
    import java.rmi.server.UnicastRemoteObject; 
    import java.net.*; 
    public class Server implements Hello { 
    public Server() {} 
    public String sayHello() 
    { 
    return "Hello, world!";  
    } 
    public static void main(String args[]) 
    { 
    try 
     { 
     Server obj = new Server(); 
     Hello stub = (Hello) UnicastRemoteObject.exportObject(obj, 0); 
     // Bind the remote object's stub in the registry 
     Registry registry = LocateRegistry.getRegistry(); 

      registry.bind("HelloServer", stub); 
     System.err.println("Server ready"); 
     } catch (Exception e) 
       { 
       System.err.println("Server exception: " + e.toString()); 
       e.printStackTrace(); 
       } 
    } 
} 

이 클라이언트 코드 :

import java.rmi.*; 
    import java.rmi.server.*;//////note additional imports 
    import java.io.*; 
    import java.rmi.registry.LocateRegistry; 
    import java.rmi.registry.Registry; 
    import java.net.*; 

    public class HelloClient2 { 
    private HelloClient2() {} 
    public static void main(String[] args) { 
String host = (args.length < 1) ? null : args[0]; 
try {/////note this addition 
    RMISocketFactory.setSocketFactory(new sun.rmi.transport.proxy.RMIHttpToCGISocketFactory());  
    Registry registry = LocateRegistry.getRegistry(host); 
    Hello stub = (Hello) registry.lookup("HelloServer"); 
    String response = stub.sayHello(); 
    System.out.println("response: " + response); 
    } catch (Exception e) { 
    System.err.println("Client exception: " + e.toString()); 
    e.printStackTrace();  
    }  
    } 
} 

지금 나는 RMI 서버에 연결된 목표 - C 클라이언트를 만들려면 자신의 서버 구현 코드입니다. rmi 서버에서 메소드를 호출 할 수 있도록 HTTP 요청에 RMI 호출을 포함하는 Apache 웹 서버에 프록시를 만들었습니다.

클라이언트의 라인 : RMISocketFactory.setSocketFactory (새 sun.rmi.transport.proxy.RMIHttpToCGISocketFactory()); RMI 터널링 (HTTP 요청에서 RMI 호출 전달)을 담당합니다. 그래서 기본적으로이 라인은 여기서, portNum이 무엇을 의미 하는가 (익명) 서버 원격 객체

의 포트 형태

http://localhost:80/cgi-bin/java-rmi?forward=portnum 

의 HTTP POST 요청을 생성? 로컬 호스트의 포트 80에서 수신 대기중인 웹 서버가 있어야 함을 의미합니다. 이상적으로 8080을 수신하는 Apache Tomcat 웹 서버가 있지만 포트를 80으로 변경했습니다.

해결되었지만 여전히 나머지 URL은 처리해야합니다. 그래서 tomcat의 웹 어플리케이션에서 우리는 cgi-bin이라는 새로운 디렉토리를 만들었습니다. cgi-bin에는 WEB-INF 디렉토리가 있으며 여기에는 classes 디렉토리와 web.xml 파일이 있습니다. classes 디렉토리에 서버와 클라이언트의 컴파일 된 클래스와 서블릿 핸들러를 추가했다. 서블릿 핸들러는 http 포스트 요청을 수신하고 rmi 호출을 페치하여 rmi 서버로 전달합니다.

웹 서버에서 서블릿 처리기를 호출해야한다는 것을 어떻게 알 수 있습니까? web.xml 파일에서 ServletHandler (클래스 이름)라는 이름의 서블릿 항목과 url 매핑 인/java-rmi를 추가했습니다. 그런 식으로 로컬 호스트는 요청을 전달할 위치를 알고 있습니다. 전에 말했듯이 서블릿 핸들러가 요청을 받으면이를 처리하여 rmi 서버로 보냅니다.

지금 내 문제는 다음과 같습니다

Registry registry = LocateRegistry.getRegistry(host); 
    Hello stub = (Hello) registry.lookup("HelloServer"); 

단순히 레지스트리를 찾는 방법을 모르는 원격 객체를 찾을 목적-C에서 그것을 찾아 볼 수 있습니다. (그루터기는 원격 객체의 로컬 참조 임)

그리고 프록시를 사용하여 수행 할 수 있다고 생각하지 않습니다. 프록시는 특별히 rmi 서버로 향하는 요청을 처리하도록 만들어졌습니다. 따라서 서블릿을 테스트하려면 서버에 구현 된 sayHello()와 같은 특정 원격 메소드를 호출해야합니다. 레지스트리 관련 항목은 원격 메소드 호출이 아닙니다.

그래서 이것을 객관적인 C에서 어떻게 처리합니까?

+1

와우 - 삶을 어렵게 만드는 이유 대신 표준 REST 또는 SOAP 인터페이스를 대신 사용하십시오. REST와 SOAP API를 사용할 준비가되어있다. – dngfng

+0

나는 이것을해야만한다. 내 상사가 이런 식으로 원한다. ( – DalalH

+1

당신은 상사에게 자신의 방식대로 할 수 없다고 말해야 할 것입니다. – dngfng

답변

2

당신의 상사가 원하는 것은 중요하지 않습니다. 대답은 the same as the last time you posted this question입니다. 그것은 할 수 없습니다. 질문을 다시 게시해도 변경되지 않습니다.

+1

어제 내 상사에게 어제 끝낼 수 없다고 말했을 때, 그는 객관적인 C를 아파치 바람둥이에 연결하고 HTTP와 함께 SOAP를 사용한다면, 내가 가질 수 없다고 주장했다. C에서 레지스트리와 원격 객체를 처리하는 방법에 대해 걱정할 필요가있다. 나는 아직도 그것을 수행하는 방법을 이해하지 못하며, 이것은 매우 유용하다./ – DalalH

+0

@ user1758617 당신의 상사는 그것에 대해 100 % 정확하다. . 그러나 그것은 RMI가 아니며, SOAP/HTTP이며, UnicastRemoteObect와 Registry와는 아무런 관련이 없습니다. 너는 틀린 나무를 짖고있다. – EJP

관련 문제