爪哇:从我的应用程序按需运行 HTTP 服务器?
题
我想写一个 简单的P2P 使用HTTP作为基础协议的测试应用程序。
该应用程序必须 按需决定, ,如果应该充当 HTTP服务器, ,或作为 HTTP客户端.
我知道的经典方式是将应用程序部署在某些 现存的 HTTP 服务器。但这对于我的意图来说是错误的。它必须是另一种方式:该服务器由应用程序启动(并且仅在决定之前)。
有没有办法执行HTTP服务器部分 一经请求(无需在服务器上部署应用程序本身)?
我可以通过链接玻璃鱼或tomcat库并调用一些“主要”方法来做到这一点吗?
编辑:有用!!!
我现在尝试了 码头 随着 JAX-RS(泽西岛) 成功地!
谢谢你们。
(REST 类很琐碎并且被忽略)
打包 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();
}
}
解决方案
您可以使用码头或一些其它可嵌入的HTTP服务器。从码头的网站:
码头是提供一个HTTP服务器,HTTP客户端和容器的javax.servlet一个开源项目。这些100%Java组件是全功能的,基于标准的,小脚印,嵌入,异步和企业可扩展性。码头是在Apache许可证2.0下双许可和/或蚀公共许可证1.0。码头是自由下的任一那些许可证的条款商业使用和分配。
其他提示
除了其他的答案也存在 NanoHTTPD 。它非常的小,在短短的一类,也许是正确的事情,如果YOUT不需要更多的还是只想让事情变得微乎其微。
看看在的Restlet 项目。它们提供了一个嵌入的,独立的服务器和客户机,两者使用相同的Java API(著名的统一接口)。
Glassfish的,Tomcat或servlet的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();
Java 6 包含一个内置的 Web 服务器。你可以像这样使用它:
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://本地主机:8000 查看您的回复。
JavaDoc 中有更多示例 Http服务器包
如果你不能保证 Java 6,请看一下 嵌入 Jetty 6 这是简单且相当轻量级的,即你不需要一个完整的网络应用程序。