Java 如何实现一个http服务器

在Java中可以使用HttpServer类来实现Http服务器,该类位于com.sun.net包下(rt.jar)。实现代码如下:

主程序类

package bg.httpserver;

import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.net.InetSocketAddress;
import java.util.concurrent.Executors;

public class HttpServerStarter {
  public static void main(String[] args) throws IOException {
    //创建一个HttpServer实例,并绑定到指定的IP地址和端口号
    HttpServer httpServer = HttpServer.create(new InetSocketAddress(8080), 0);

    //创建一个HttpContext,将路径为/myserver请求映射到MyHttpHandler处理器
    httpServer.createContext("/myserver", new MyHttpHandler());

    //设置服务器的线程池对象
    httpServer.setExecutor(Executors.newFixedThreadPool(10));

    //启动服务器
    httpServer.start();
  }
}

HttpServer:HttpServer主要是通过带参的create方法来创建,第一个参数InetSocketAddress表示绑定的ip地址和端口号。第二个参数为int类型,表示允许排队的最大TCP连接数,如果该值小于或等于零,则使用系统默认值。

createContext:可以调用多次,表示将指定的url路径绑定到指定的HttpHandler处理器对象上,服务器接收到的所有路径请求都将通过调用给定的处理程序对象来处理。

setExecutor:设置服务器的线程池对象,不设置或者设为null则表示使用start方法创建的线程。

HttpHandler实现

package bg.httpserver;

import com.sun.net.httpserver.Headers;
import com.sun.net.httpserver.HttpExchange;
import com.sun.net.httpserver.HttpHandler;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 处理/myserver路径请求的处理器类
 */
public class MyHttpHandler implements HttpHandler {
  @Override
  public void handle(HttpExchange httpExchange) {
    try {
      StringBuilder responseText = new StringBuilder();
      responseText.append("请求方法:").append(httpExchange.getRequestMethod()).append("<br/>");
      responseText.append("请求参数:").append(getRequestParam(httpExchange)).append("<br/>");
      responseText.append("请求头:<br/>").append(getRequestHeader(httpExchange));
      handleResponse(httpExchange, responseText.toString());
    } catch (Exception ex) {
      ex.printStackTrace();
    }
  }

  /**
   * 获取请求头
   * @param httpExchange
   * @return
   */
  private String getRequestHeader(HttpExchange httpExchange) {
    Headers headers = httpExchange.getRequestHeaders();
    return headers.entrySet().stream()
                .map((Map.Entry<String, List<String>> entry) -> entry.getKey() + ":" + entry.getValue().toString())
                .collect(Collectors.joining("<br/>"));
  }

  /**
   * 获取请求参数
   * @param httpExchange
   * @return
   * @throws Exception
   */
  private String getRequestParam(HttpExchange httpExchange) throws Exception {
    String paramStr = "";

    if (httpExchange.getRequestMethod().equals("GET")) {
      //GET请求读queryString
      paramStr = httpExchange.getRequestURI().getQuery();
    } else {
      //非GET请求读请求体
      BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(httpExchange.getRequestBody(), "utf-8"));
      StringBuilder requestBodyContent = new StringBuilder();
      String line = null;
      while ((line = bufferedReader.readLine()) != null) {
        requestBodyContent.append(line);
      }
      paramStr = requestBodyContent.toString();
    }

    return paramStr;
  }

  /**
   * 处理响应
   * @param httpExchange
   * @param responsetext
   * @throws Exception
   */
  private void handleResponse(HttpExchange httpExchange, String responsetext) throws Exception {
    //生成html
    StringBuilder responseContent = new StringBuilder();
    responseContent.append("<html>")
        .append("<body>")
        .append(responsetext)
        .append("</body>")
        .append("</html>");
    String responseContentStr = responseContent.toString();
    byte[] responseContentByte = responseContentStr.getBytes("utf-8");

    //设置响应头,必须在sendResponseHeaders方法之前设置!
    httpExchange.getResponseHeaders().add("Content-Type:", "text/html;charset=utf-8");

    //设置响应码和响应体长度,必须在getResponseBody方法之前调用!
    httpExchange.sendResponseHeaders(200, responseContentByte.length);

    OutputStream out = httpExchange.getResponseBody();
    out.write(responseContentByte);
    out.flush();
    out.close();
  }
}

运行HttpServerStarter,在浏览器中访问如下:

以上就是Java 如何实现一个http服务器的详细内容,更多关于Java 实现http服务器的资料请关注我们其它相关文章!

(0)

相关推荐

  • java编写Http服务器下载工具

    这个工具比较简单,用于配合另外一个工具进行文件传送,废话少说,上代码 import java.net.URL; import java.net.URLConnection; import java.io.File; import java.io.InputStream; import java.io.FileOutputStream; import java.io.FileNotFoundException; import java.io.IOException; import org.apac

  • java Socket实现简单模拟HTTP服务器

    最近复习计算机网络,复习完应用层之后对于理论知识还是没有一个深刻的概念,索性就动手用Java Socket API 模拟做一个HTTP服务器,巩固一下应用层的知识. HTTP基于TCP协议,协议采用了请求/响应模型.客户端向服务器发送一个请求,请求头包含请求的方法.URL.协议版本.以及包含请求修饰符.客户信息和内容的类似于MIME的消息结构.服务器以一个状态行作为响应,响应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息.实体元信息以及可能的实体内容--百度百科. 话不多说,还是直

  • Java下载https文件并上传阿里云oss服务器

    这篇文章主要介绍了Java下载https文件并上传到阿里云oss服务器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 今天做了一个从Https链接中下载音频并且上传到OSS服务器,记录一下希望大家也少走弯路. 一共两个类: 1 .实现自己的证书信任管理器类 /** * @author mazhq * @Title: X509TrustUtiil * @ProjectName: zeus * @Description: 证书信任管理器类 * @d

  • Java/Android 实现简单的HTTP服务器

    目前在对Android的代码进行功能测试的时候,需要服务器返回一个数据来测试整个流程是否正确.不希望引入第三方的JAR包,因此需要一个特别简单的HTTP服务器. 网上查询了一下,找到可用的代码如下: import java.io.BufferedOutputStream; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundEx

  • java实现轻量型http代理服务器示例

    复制代码 代码如下: package cn.liangjintang.httpproxy; import java.io.BufferedReader;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.OutputStream;import java.net.ServerS

  • Java使用NioSocket手动实现HTTP服务器

    NioSocket简单复习 重要概念 NioSocket里面的三个重要概念:Buffer.Channel.Selector Buffer为要传输的数据 Channel为传输数据的通道 Selector为通道的分配调度者 使用步骤 使用NioSocket实现通信大概如以下步骤: ServerSocketChannel可以通过configureBlocking方法来设置是否采用阻塞模式,设置为false后就可以调用register注册Selector,阻塞模式下不可以用Selector. 注册后,S

  • 如何使用HttpClient发送java对象到服务器

    这篇文章主要介绍了如何使用HttpClient发送java对象到服务器,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 一.首先导入apache依赖的pom文件包 <dependency> <groupId>org.apache.httpcomponents</groupId> <artifactId>httpclient</artifactId> </dependency> 二.创建

  • Java 如何实现一个http服务器

    在Java中可以使用HttpServer类来实现Http服务器,该类位于com.sun.net包下(rt.jar).实现代码如下: 主程序类 package bg.httpserver; import com.sun.net.httpserver.HttpServer; import java.io.IOException; import java.net.InetSocketAddress; import java.util.concurrent.Executors; public class

  • java搭建一个Socket服务器响应多用户访问

    当我们搭建了一个Socket服务端,是需要去响应多用户的访问的.此时,我们就要使用多线程,为每个访问的用户建立一个线程来响应该用户的访问. 具体实现,看如下代码: package com.sun.socket; import Java.io.IOException; import java.NET.*; import java.io.*; import java.util.*; /** * Description: * 搭建一个Socket服务器响应多用户访问 * @author Lee * *

  • 3分钟用Docker搭建一个Minecraft服务器

    1 写在前面的话 作为一名资深游戏玩家,初次接触Minecraft(我的世界)时我是拒绝的,但玩了一段时间之后便欲罢不能.Minecraft(以下简称MC)作为一款沙盒类游戏,具有极高的自由度,想玩什么完全取决于你.你可以进行传统的荒野求生,打怪升级,可以建造各种风格的建筑,可以成为红石达人,实现各种自动化等等.这是一款最典型的"别人的游戏",有大神在游戏里造了一个32位的计算机你能信?别人的世界,哦不,是我的世界就先介绍到这里. 言归正传,前段时间用网易蜂巢的容器搭了一个Minecr

  • 基于Java Socket实现一个简易在线聊天功能(一)

    最近做了一个项目,其中有一个在线网页交流的需求,好久没写代码了,手都生疏了,于是先写demo练练手,分享到我们平台,以此做个记录,方便自己和大家使用. 先给大家说下实现步骤分这样几大步: 1.使用awt组件和socket实现简单的单客户端向服务端持续发送消息: 2.结合线程,实现多客户端连接服务端发送消息: 3.实现服务端转发客户端消息至所有客户端,同时在客户端显示: 4.把awt组件生成的窗口界面改成前端jsp或者html展示的界面,java socket实现的客户端改为前端技术实现. 这里首

  • Java实现文件上传服务器和客户端

    本文实例为大家分享了Java实现文件上传服务器和客户端的具体代码,供大家参考,具体内容如下 文件上传服务器端: /** * 使用TCP协议实现上传功能的服务器端 * 思路: * 新建ServerSocket * 等待客户端连接 * 连接上后开启子线程,把连接获取的Socket传给子线程 * 循环进行 * @author yajun * */ public class UploadServer { public static void main(String[] args) { UploadSer

  • Java编程实现多线程TCP服务器完整实例

    相关Java类 Socket public class Socket extends Object ·功能:TCP客户端套接字 ·构造方法: Socket(InetAddress address, int port) 创建一个流套接字并将其连接到指定 IP 地址的指定端口号 ·常用方法: 1.getInetAddress 获得InetAddress的相关信息 2.getInputStream 获得此TCP连接的输入流 3.getOutPutStream 获得此TCP连接的输出流 ServerSo

  • 如何在 Java 中实现一个 redis 缓存服务

    缓存服务的意义 为什么要使用缓存?说到底是为了提高系统的运行速度.将用户频繁访问的内容存放在离用户最近,访问速度最快的地方,提高用户的响应速度.一个 web 应用的简单结构如下图. web 应用典型架构 在这个结构中,用户的请求通过用户层来到业务层,业务层在从数据层获取数据,返回给用户层.在用户量小,数据量不太大的情况下,这个系统运行得很顺畅.但是随着用户量越来越大,数据库中的数据越来越多,系统的用户响应速度就越来越慢.系统的瓶颈一般都在数据库访问上.这个时候可能会将上面的架构改成下面的来缓解数

  • java UDP实现一个聊天工具的示例代码

    题目: 假设Tom和Jerry利用Java UDP进行聊天,请为他们编写程序.具体如下: (1).Tom和Jerry聊天的双方都应该具有发送端和接收端: (2).利用DatagramSocket与DatagramPacket: (3).实现 java.lang.Runnable类,重写 run()方法. 学过计网的都知道,利用三元组(ip地址,协议,端口)就可以标识网络的进程了. 而进行通信我们直接运用socket就可以了,首先需要知道是socket是什么,这部分可以参考这个大佬写的博客. ht

  • 详解node.js创建一个web服务器(Server)的详细步骤

    前言 在 node.js 中创建一个服务器非常简单,只需要使用 node.js 为我们提供的 http 模块及相关 API 即可创建一个麻雀虽小但五脏俱全的web 服务器,相比 Java/Python/Ruby 搭建web服务器的过程简单的很. http model 要想创建一个基于 node.js 的 web 服务器,你就必须使用 node.js 提供的 http 模块,node.js 中的 http 接口旨在支持传统上难以使用的协议的许多特性, 特别是,大块的.可能块编码的消息,接口永远不会

  • Java如何搭建一个个人网盘

    目录 前言 一.项目介绍 二.网盘搭建 2.1 Windows 环境运行 2.2 Linux 环境运行 三.开发环境运行 3.1 下载项目 3.2 运行 3.3 阅读代码 四.功能说明 4.1 上传 4.2 视频/音频播放 4.3 快捷键使用 4.4 配置文件修改 4.5 在线预览 4.6 分享下载链接 五.最后 前言 本文适合有 Java 基础知识的人群,跟着本文可学习和运行 Java 网盘项目. 今天给大家带来一款开源 Java 版网盘项目-- kiftd-source,本文将用 3 分钟带

随机推荐