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执行远端服务器的脚本 问题描述 实现思路 技术要点 代码实现 问题描述 工作中遇到这样一个问题,我们的应用为了实现高可用会采取双机部署,拓扑图大致如下: 这种方案可以简单的保证高可用,即便应用 ...
随机推荐
- 键盘事件与JS Filter
今天在写一个JS输入文本过滤的程序,本来我的设想是在keypress事件中获取按下的键,然后再进行判断,这样的话总是出错,最后终于明白自己把事件的发生顺序搞错了,应该是先keydown,然后是keyp ...
- HDU-4879-ZCC loves march(map+set+并查集)
Description On a m*m land stationed n troops, numbered from 1 to n. The i-th troop's position can be ...
- 标准差(standard deviation)和标准误差(standard error)你能解释清楚吗?
by:ysuncn(欢迎转载,请注明原创信息) 什么是标准差(standard deviation)呢?依据国际标准化组织(ISO)的定义:标准差σ是方差σ2的正平方根:而方差是随机变量期望的二次偏差 ...
- mybatis12 Usermapper.xml
输入和输出映射 通过parameterType完成输入映射,通过resultType和resultMap完成输出映射. 1.1parameterType传递pojo包装对象 可以定义pojo包装类型扩 ...
- 线程本地存储(Thread Local Storage, TLS)简单分析与使用
在多线程编程中, 同一个变量, 如果要让多个线程共享访问, 那么这个变量可以使用关键字volatile进行声明; 那么如果一个变量不想使多个线程共享访问, 那么该怎么办呢? 呵呵, 这个办法就是TLS ...
- verview of Spring Framework--转
http://docs.spring.io/spring/docs/current/spring-framework-reference/html/overview.html 2. Introduct ...
- hdu2049.java
hdu 2049 不容易系列之(4)——考新郎 (组合+错排) 国庆期间,省城HZ刚刚举行了一场盛大的集体婚礼,为了使婚礼进行的丰富一些,司仪临时想出了有一个有意思的节目,叫做"考新郎&qu ...
- Eclipse将项目部署tomcat的webapps目录
Eclipse将项目部署tomcat的webapps目录 >>>>>>>>>>>>>>>>>& ...
- mRemote配置
配置完mRemote后 备份C:\Users\Administrator\AppData\Local\Felix_Deimel\mRemote\confCons.xml文件 覆盖到其他电脑可以直接使用
- 基于Memcache的分布式缓存系统详解
文章不是简单的的Ctrl C与V,而是一个字一个标点符号慢慢写出来的.我认为这才是是对读者的负责,本教程由技术爱好者成笑笑(博客:http://www.chengxiaoxiao.com/)写作完成. ...