Java实现http服务器(一)
基于Java实现Http服务器有多种多样的方法
一种轻量级的方式是使用JDK内置的com.sun.net.httpserver包下和sun.net.httpserver包下类提供的方法构建,该方法轻便快捷。
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors; import com.sun.net.httpserver.HttpServer; /**
* @author 作者 E-mail:
* @version 创建时间:2015-10-24 下午04:51:40 类说明
*/
public class HttpServerManager
{
private final static HttpServerManager instance = new HttpServerManager(); private HttpServer httpServer = null; private ExecutorService executor = null; private HttpServerManager()
{ } public final static HttpServerManager getInstance()
{
return instance;
} public final void init() throws IOException
{
this.executor = Executors.newCachedThreadPool();
final InetSocketAddress sa = new InetSocketAddress("0.0.0.0", 8080);
this.httpServer = HttpServer.create(sa, 0);
this.httpServer.setExecutor(this.executor);
this.httpServer.createContext("/", new HttpServerHandler());
this.httpServer.start();
} public final void exit()
{
this.executor.shutdown();
this.httpServer.stop(0);
}
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.URI; import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.ssl.HttpsURLConnection; /**
* @author 作者 E-mail:
* @version 创建时间:2015-10-24 下午05:02:25 类说明
*/
public class HttpServerHandler implements HttpHandler
{
public void onError(HttpExchange exchange) throws IOException
{
exchange.sendResponseHeaders(HttpsURLConnection.HTTP_BAD_REQUEST,0);
exchange.getResponseBody().close();
} public static String getQueryString(HttpExchange exchange) throws IOException
{ if (exchange.getRequestMethod().equalsIgnoreCase("GET"))
{
return exchange.getRequestURI().getQuery();
} String requestBodyString = getRequestBodyString(exchange); if (requestBodyString.length() == 0)
{
return exchange.getRequestURI().getQuery();
}
return requestBodyString;
} public static String getRequestBodyString(HttpExchange exchange) throws IOException
{
BufferedReader br = new BufferedReader(new InputStreamReader(exchange.getRequestBody(), "UTF-8"));
StringBuilder builder = new StringBuilder();
String line = null;
while ((line = br.readLine()) != null)
{
builder.append(line);
} return builder.toString();
} @SuppressWarnings("deprecation")
@Override
public void handle(HttpExchange exchange) throws IOException
{
OutputStream os = null;
final URI uri = exchange.getRequestURI();
//http://127.0.0.1:8080/cmd/helloWorld
final String path = uri.getPath();
final String query = getQueryString(exchange);
final Headers responseHeaders = exchange.getResponseHeaders();
// 返回结果
final byte[] result = new byte[] { ' ', ' ' }; responseHeaders.set("Content-Type", "text/plain");
responseHeaders.set("Content-length", String.valueOf(result.length)); exchange.sendResponseHeaders(HttpsURLConnection.HTTP_OK, 0);
os = exchange.getResponseBody();
os.write(result); os.close();
}
}
再举一个使用jdk自带httpserver组件的例子:
import java.io.IOException;
import java.io.OutputStream;
import java.net.InetSocketAddress;
import java.util.Iterator;
import java.util.List;
import java.util.Set;
import java.util.concurrent.Executors; import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import com.sun.net.httpserver.HttpServer;
//在eclipse中会出现Access restriction: The type Headers is not accessible due to restriction on required library
//解决办法:把Windows-Preferences-Java-Complicer- Errors/Warnings里面的Deprecated and restricted API中的Forbidden references(access rules)选为Warning就可以编译通过。
/**
* 使用jdk自带sun httpserver组件构建Http服务器,
* JDK自带的HttpServer是一个非常轻量级的Http服务端框架,但是它非常灵活,易于扩展,
* @author Administrator
*
*/
public class HttpServerDemo {
public static void main(String[] args) throws IOException {
InetSocketAddress addr = new InetSocketAddress(8080);
HttpServer server = HttpServer.create(addr, 0); server.createContext("/", new MyHandler());
server.setExecutor(Executors.newCachedThreadPool());
server.start();
System.out.println("Server is listening on port 8080");
}
} class MyHandler implements HttpHandler { public void handle(HttpExchange exchange) throws IOException { String requestMethod = exchange.getRequestMethod();
System.out.println("处理新请求:"+requestMethod);
if (requestMethod.equalsIgnoreCase("GET")) {
Headers responseHeaders = exchange.getResponseHeaders();
responseHeaders.set("Content-Type", "text/plain");
exchange.sendResponseHeaders(200, 0); OutputStream responseBody = exchange.getResponseBody();
Headers requestHeaders = exchange.getRequestHeaders();
Set<String> keySet = requestHeaders.keySet();
Iterator<String> iter = keySet.iterator();
while (iter.hasNext()) {
String key = iter.next();
List values = requestHeaders.get(key);
String s = key + " = " + values.toString() + "\n";
responseBody.write(s.getBytes());
}
responseBody.close();
}
}
}
Java实现http服务器(一)的更多相关文章
- Java获取Web服务器文件
Java获取Web服务器文件 如果获取的是服务器上某个目录下的有关文件,就相对比较容易,可以设定死绝对目录,但是如果不能设定死绝对目录,也不确定web服务器的安装目录,可以考虑如下两种方式: 方法一: ...
- 一个java页游服务器框架
一.前言 此游戏服务器架构是一个单服的形式,也就是说所有游戏逻辑在一个工程里,没有区分登陆服务器.战斗服务器.世界服务器等.此架构已成功应用在了多款页游服务器 .在此框架中没有实现相关业务逻辑,只有简 ...
- Android中实现java与PHP服务器(基于新浪云免费云平台)http通信详解
Android中实现java与PHP服务器(基于新浪云免费云平台)http通信详解 (本文转自: http://blog.csdn.net/yinhaide/article/details/44756 ...
- JAVA编写WEB服务器
一.超文本传输协议 1.1 HTTP请求 1.2 HTTP应答 二.Socket类 三.ServerSocket类 四.Web服务器实例 4.1 HttpServer类 4.2 Requ ...
- java socket 单服务器多客户端实时通信
想用JAVA做一个服务器,请问怎么利用TCP和线程,实现多个客户端同时在线,能与服务器进行交互? 服务器监听端口 做个无限循环 接到一个连接就创建一个通道线程,并将通道线程存储到一个list集合中 1 ...
- [置顶] java web 动态服务器
写了一个java web 动态服务器,主要通过内部类来实现,动态类使用了外部类,采用了 classforname 实例化,动态类的构造方法不能带参数, 效果都出来了,分享给有需要的 朋友.判断做的不够 ...
- 实战WEB 服务器(JAVA编写WEB服务器)
实战WEB 服务器(JAVA编写WEB服务器) 标签: web服务服务器javawebsockethttp服务器 2010-04-21 17:09 11631人阅读 评论(24) 收藏 举报 分类: ...
- Java代码调用服务器上的Shell脚本
Java代码调用服务器上的Shell脚本 这里主要是因为我们报表平台有用到用户手工录入的数据作为结果数据且需要纳入saiku去展示 如我们所知,saiku不会自动刷新,所以需要在数据更新接口中调用服务 ...
- JAVA执行远端服务器的脚本
JAVA执行远端服务器的脚本 问题描述 实现思路 技术要点 代码实现 问题描述 工作中遇到这样一个问题,我们的应用为了实现高可用会采取双机部署,拓扑图大致如下: 这种方案可以简单的保证高可用,即便应用 ...
随机推荐
- 局域网内使用linux的ntp服务
假设我们的饿局域网无法连接外网,但又需要同步时间,怎么办? 1. 已局域网内的一台机器作为基础,适用date修改其他机器的时间,date -s ...,很不方便,这里不介绍. 2. 适用ntp服务,自 ...
- PHP安全外延
接下来,我们讲一下:php语言与Apache等中间.MySQL等数据库结合使用时所产生的一些安全问题. 1.文件解析漏洞分析 2.编码注入漏洞分析 3.is_numeric漏洞分析
- jackson 学习笔记
Jackson以优异的解析性能赢得了好评,今天就看看Jackson的一些简单的用法. Jackson使用之前先要下载,这里一共有三个jar包,想要获得完美的Jackson体验,这三个jar包都不可或缺 ...
- Installing the .NET Framework 4.5, 4.5.1
This article provides links for installing the .NET Framework 4.5 and 4.5.1 on your computer. If yo ...
- 在ASP.NET中ShowModalDialog+ztree的使用
.aspx: <script type="text/javascript"> function getReturnValue() { var strResult = w ...
- 第六篇:web之python框架之django
python框架之django python框架之django 本节内容 web框架 mvc和mtv模式 django流程和命令 django URL django views django te ...
- JS时间戳
var timestamp1 = Date.parse(new Date()); var timestamp2 = Date.parse(new Date()); var times = timest ...
- 程序员带你十天快速入门Python,玩转电脑软件开发(二)
关注今日头条-做全栈攻城狮,学代码也要读书,爱全栈,更爱生活.提供程序员技术及生活指导干货. 如果你真想学习,请评论学过的每篇文章,记录学习的痕迹. 请把所有教程文章中所提及的代码,最少敲写三遍,达到 ...
- 学习完毕-css
最近零零散散学习了css 最后附带链接,里面有css的全部demo.有空的可以练习练习,下一步 --->js -----http://www.w3cschool.cc/css/css-examp ...
- Java获取项目路径
参考博客.自己就不写了.我觉得他写得很详细 http://blog.csdn.net/hpf911/article/details/5852127