2009-04-19 9 views
1

기본 프로토콜로 HTTP를 사용하는 간단한 P2P 테스트 응용 프로그램을 으로 작성하고 싶습니다. 수요 결정에
응용 프로그램은,이 경우 그것은해야 HTTP 서버, 또는 HTTP 클라이언트로 역할을합니다.
Java : 내 응용 프로그램에서 요청시 HTTP 서버를 실행 하시겠습니까?

제가 알고있는 고전적인 방법은 기존 HTTP 서버에 앱을 배포하는 것입니다. 그러나 이것은 내 의도에 대한 잘못된 길이다. 다른 방법이 있습니다. 서버가 앱에 의해 시작되었습니다 (결정한 경우에만 ).

(서버에 앱 자체를 배포하지 않고) HTTP 서버 부분을 (요청시) 실행하는 방법이 있습니까?

글래스 피쉬 또는 톰캣 라이브러리 을 연결하고 "기본"방법이라고 부를 수 있습니까?

편집 : IT WORKS !!!
이제 부두JAX-RS (저지)과 함께 성공적으로 시도했습니다.
감사합니다.

패키지 my.p2p (나머지 클래스와 단순 탈락이다);

import com.sun.jersey.spi.container.servlet.*; 
import org.mortbay.jetty.*; 
import org.mortbay.jetty.servlet.*; 

public class Main { 
    public static void main(String[] args) 
     throws Exception { 

    ServletHolder holder = new ServletHolder(ServletContainer.class); 

    holder.setInitParameter("com.sun.jersey.config.property.resourceConfigClass", 
     "com.sun.jersey.api.core.PackagesResourceConfig"); 
    holder.setInitParameter("com.sun.jersey.config.property.packages", "my.p2p.rest"); 

    Server server = new Server(8000); 

    Context context = new Context(server, "/", Context.SESSIONS); 
    context.addServlet(holder, "/*"); 
    server.start(); 
    } 
} 

답변

2

Jetty 또는 기타 포함 가능한 HTTP 서버를 사용할 수 있습니다. Jetty의 웹 사이트에서 :

Jetty는 HTTP 서버, HTTP 클라이언트 및 javax.servlet 컨테이너를 제공하는 오픈 소스 프로젝트입니다. 이 100 % 자바 구성 요소는 완전한 기능을 갖춘 표준 기반, 작은 풋 프린트, 임베디드, 비동기 및 엔터프라이즈 확장 성을 갖추고 있습니다. Jetty는 Apache License 2.0 및/또는 Eclipse Public License 1.0에 따라 이중 라이센스가 부여됩니다.Jetty는 라이센스 중 하나의 조건에 따라 상업적으로 사용 및 배포 할 수 있습니다.

1

restlet 프로젝트를 살펴보십시오. 이들은 임베디드 가능한 독립형 서버와 클라이언트를 제공하며 둘 다 동일한 Java API (유명한 Uniform Interface)를 사용합니다.

글래스 피쉬, 톰캣 또는 서블릿 API는 다소 과도한 것 같습니다. 거기에 다른 답변 옆에 내 0.02 $ :

편집

클라이언트

Client client = new Client(Protocol.HTTP); 
client.get("http://127.0.0.1").getEntity().write(System.out); 

서버

Restlet sayHello = new Restlet() { 
    @Override 
    public void handle(Request request, Response response) { 
     response.setEntity("Hello World!", MediaType.TEXT_PLAIN); 
    } 
}; 

new Server(Protocol.HTTP, 80, sayHello).start(); 
+0

저지는 어떻게 든 Restlet과 유사하다고 생각하나요? Can Jersey도 사용할 수 있습니까? 고맙습니다. –

+0

저지는 편안한 서비스의 RI입니다. 클라이언트 쪽을 제공한다면 모르겠다. – dfa

2

NanoHTTPD입니다. 아주 작고, 단 하나의 수업만으로도 옳은 일이라면 더 많은 것을 필요로하지 않거나 그냥 최소한으로 유지하기를 원할 것입니다.

0

Java 6에는 웹 서버가 내장되어 있습니다. 당신과 같이 사용할 수 있습니다 :

다음
HttpServer server = HttpServer.create(new InetSocketAddress(8000), 0); 
    server.createContext("/", new HttpHandler() { 
     @Override 
     public void handle(HttpExchange xchange) throws IOException { 
      String response = "This is the response"; 
      xchange.sendResponseHeaders(200, response.length()); 
      OutputStream os = xchange.getResponseBody(); 
      os.write(response.getBytes()); 
      os.close(); 
     } 
    }); 
    server.setExecutor(null); 
    server.start(); 

그리고 당신의 응답을 볼 수 http://localhost:8000에 액세스 할 수 있습니다. 당신이 쉽고 매우 lightwight입니다 embedding Jetty 6에서 살펴보고, 자바 6 보장 할 수 없습니다 즉 당신은 전체 웹 애플리케이션이 필요하지 않은 경우

HttpServer package

에 대한 JavaDoc을에 더 많은 예제가 있습니다.

+0

내부 com.sun. * 또는 sun. * 인터페이스 및 클래스는 언제든지 변경되거나 사용되지 않을 수 있으므로 사용하지 않는 것이 좋습니다. –

+0

물론 이것은 Jersey와 같은 Sun의 별도 라이브러리에는 적용되지 않습니다. –

+0

사실, "Sun Java 6을 보장 할 수 없다면"을 지정해야합니다. 대신 Jetty를 사용하십시오. – deverton

관련 문제