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 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();
        }
    }
} 
时间: 2025-01-02 04:43:37

Java实现http服务器(一)的相关文章

java web 从服务器上下载图片资料

package com.Action; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.net.HttpURLConnection; import java.net.MalformedURLException; import java.net.URL; public class HttpUtils {

【Java】对服务器程序的理解

Login:------------->方法 Data:----->类.API数据 Collection:-------->集合 Data Source File: Database: Networking:------->java.net/javax.net Web Service: Stream [Java]对服务器程序的理解,布布扣,bubuko.com

[Java聊天室服务器]实战之六 去除死链接

前言 学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比如最近在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)

[Java聊天室服务器]实战之五 读写循环(服务端)

前言 学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比如最近在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)

关于Java获取本地服务器IP的问题

Java获取本地服务器IP,我们最简单的写法: import java.net.InetAddress; public class CatchIp{ public static void main(String[] args) { try { // 获取IP地址 String ip = InetAddress.getLocalHost().getHostAddress(); System.out.println("IP地址:"+ip); } catch (Exception e) {

【转】一个java页游服务器框架

源地址:http://www.cnblogs.com/metoy/p/4305326.html?utm_source=tuicool&utm_medium=referral 一.前言 此游戏服务器架构是一个单服的形式,也就是说所有游戏逻辑在一个工程里,没有区分登陆服务器.战斗服务器.世界服务器等.此架构已成功应用在了多款页游服务器 .在此框架中没有实现相关业务逻辑,只有简单的测试用的注册登陆功能.但在此框架中添加相应的业务逻辑也是比较轻松的,只需要添加相应的协议,编写对应的消息处理器即可. 下面

[Java聊天室服务器]实战之八 读写循环(客户端)

前言 学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比如最近在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)

[Java聊天室服务器]实战之四 线程类

前言 学习任何一个稍有难度的技术,要对其有充分理性的分析,之后果断做出决定---->也就是人们常说的"多谋善断":本系列虽然涉及的是socket相关的知识,但学习之前,更想和广大程序员分享的是一种心境:学习是一个循序渐进的过程,心态应该随时调节,保持戒骄戒躁的状态.比如最近在看网易公开课MIT<算法导论>,老师提到,学习算法之前要计算机数学+离散数学+概率论等课程的知识,所以一直学不好算法的程序员不妨从基础入手,这都是中国式教育惹的祸啊!(此处省略一万字......)

java 定时检测服务器端口状态方法(一)

最近在写运维管理平台的定时检测集群中各台服务器端口开放状态来判断进程状态的定时任务.顺便整理了下java如何检测服务器一个或者多个端口,以及如何加到定时任务中. 一.java中用Socket检测服务器一个端口开放状态.(对socket不太了解,只是最近用才简单看了下) Socket的英文原义是"孔"或"插座".作为BSD UNIX的进程通信机制,取后一种意思.通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄.在Internet上的