가능한 중복 :자바 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에서 어떻게 처리합니까?
와우 - 삶을 어렵게 만드는 이유 대신 표준 REST 또는 SOAP 인터페이스를 대신 사용하십시오. REST와 SOAP API를 사용할 준비가되어있다. – dngfng
나는 이것을해야만한다. 내 상사가 이런 식으로 원한다. ( – DalalH
당신은 상사에게 자신의 방식대로 할 수 없다고 말해야 할 것입니다. – dngfng