Java: exécuter le serveur HTTP à la demande de mon application?
Question
Je veux écrire une application de test P2P simple, qui utilise HTTP
protocole sous-jacent.
L'application doit décider de la demande , si elle
agir en tant que serveur HTTP , ou en tant que client HTTP .
La façon classique que je suis au courant, serait de déployer l'application sur certains HTTP existant serveur. Mais c'est la mauvaise voie à mon intention. Il doit être dans l'autre sens: le serveur est démarré par l'application (et seulement si elle décide).
Y at-il un moyen d'exécuter la partie serveur HTTP sur demande (Sans déployer l'application elle-même sur un serveur)?
Puis-je le faire en reliant les bibliothèques Glassfish ou Tomcat et appeler une méthode « principale »?
Edit: ÇA MARCHE !!!
Je maintenant essayé Jetty avec JAX-RS (Jersey) avec succès!
Merci à vous tous.
(la classe REST est trivial et omis)
paquetmy.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();
}
}
La solution
Vous pouvez utiliser Jetty ou un autre serveur HTTP intégrable. Sur le site web de la jetée:
Ponton est un projet open-source fournissant un serveur HTTP, client HTTP et contenant javax.servlet. Ces composants 100% java sont en fonctions, tout à base de normes, faible encombrement, intégrable, asynchrone et entreprise évolutive. Jetty est double sous licence Apache 2.0 et / ou Eclipse Public License 1.0. Jetty est gratuit pour une utilisation commerciale et de la distribution aux termes de l'une de ces licences.
Autres conseils
à côté des autres réponses il y a aussi NanoHTTPD . Il est très petit, en une seule classe et peut-être la bonne chose si yout ne pas besoin de plus ou tout simplement veulent garder les choses minimum.
jeter un oeil au projet Restlet . Ils fournissent un serveur autonome intégrable, et un client, à la fois en utilisant la même API Java (la fameuse interface uniforme).
Glassfish, Tomcat ou API Servlet semble être un peu exagéré pour moi. Mon 0,02 $:)
EDIT
Client
Client client = new Client(Protocol.HTTP);
client.get("http://127.0.0.1").getEntity().write(System.out);
Serveur
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 intègre un serveur Web. Vous pouvez l'utiliser comme ceci:
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();
Et puis l'accès http: // localhost:. 8000 pour voir votre réponse
Il y a d'autres exemples dans le JavaDoc pour le package HttpServer nofollow noreferrer
Si vous ne pouvez pas garantir Java 6, jetez un oeil à intégration Jetty 6 qui est facile et assez lightwight, à dire que vous n'avez pas besoin webapp entier.