Java: servidor Run HTTP na demanda do meu aplicativo?
Pergunta
Eu quero escrever um P2P simples aplicativo de teste que usa HTTP como
subjacente protocolo.
O aplicativo tem a decidir sobre a demanda , se deveria
agir como um Servidor HTTP , ou como um cliente HTTP .
A maneira clássica que eu conheço, seria para implantar o aplicativo no alguns existente HTTP servidor. Mas este é o caminho errado para a minha intenção. Tem que ser o contrário: o servidor é iniciado pelo aplicativo (e somente se decidir).
Existe uma maneira de executar a parte do servidor HTTP na demanda (Sem implantar o próprio aplicativo em um servidor)?
Posso fazê-lo ligando bibliotecas GlassFish ou Tomcat e chamar algum método "main"?
Editar: FUNCIONA !!!
Agora eu tentei Jetty , juntamente com JAX-RS (Jersey) com sucesso!
Obrigado a todos.
(a classe REST é trivial e deixado de fora)
pacote 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();
}
}
Solução
Você pode usar Jetty ou algum outro servidor HTTP embutido. Do site da Jetty:
Jetty é um projeto open-source fornecer um servidor HTTP, HTTP cliente e recipiente javax.servlet. Estes componentes java 100% são full-featured, baseados em padrões, impressão pé pequeno, embutido, escalável assíncrona e da empresa. Jetty é dupla licenciado sob a licença Apache 2.0 e / ou Eclipse Public License 1.0. Jetty é livre para uso comercial e distribuição, nos termos de qualquer dessas licenças.
Outras dicas
Ao lado das outras respostas há também NanoHTTPD . É muito pequena, em apenas uma classe e talvez a coisa certa se yout não mais precisa ou quer apenas para manter as coisas mínimas.
dar uma olhada no href="http://www.restlet.org" rel="nofollow noreferrer"> Restlet projeto . Eles fornece uma incorporável, servidor independente, e um cliente, ambos usando a mesma API Java (o famoso uniforme Interface).
Glassfish, Tomcat ou API servlet parece ser um pouco de exagero para mim. Minha US $ 0,02:)
Editar
Cliente
Client client = new Client(Protocol.HTTP);
client.get("http://127.0.0.1").getEntity().write(System.out);
Servidor
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();
Java 6 inclui um servidor Web integrado. Você pode usá-lo assim:
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();
E, em seguida, o acesso http: // localhost:. 8000 para ver a sua resposta ??p>
Há mais exemplos no JavaDoc para o httpserver pacote
Se você não pode garantir Java 6, dê uma olhada em embutindo Jetty 6 que é fácil e bastante lightwight, ou seja, você não precisa de um webapp todo.