用java编写简单Webserver,理解webserver的功能。

from http://www.cnblogs.com/wangrui-techbolg/archive/2013/03/10/2953108.html.

 

文件处理类 processer.java

package webbook.chapter2;

import java.io.*;
import java.net.Socket;

/**
 * 处理一个HTTP用户请求的线程类。
 */
public class Processor extends Thread {
    private PrintStream out;
    private InputStream input;
    /** 默认的服务器存放访问内容的目录 */
    public static final String WEB_ROOT = "/library/webserver/documents";

    public Processor(Socket socket) {
        try {
            input = socket.getInputStream();
            out = new PrintStream(socket.getOutputStream());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    public void run() {
        try {
            String fileName = parse(input);
            readFile(fileName);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 解析客户机发过的所有HTTP请求,如果是符合HTTP协议内容的, 就分析出客户机所要访问文件的名字,并且返回文件名。
     */
    public String parse(InputStream input) throws IOException {
        BufferedReader in = new BufferedReader(new InputStreamReader(input));
        String inputContent = in.readLine();
        if (inputContent == null || inputContent.length() == 0) {
            sendError(400, "Client invoke error");
            return null;
        }
        // 分析客户请求的HTTP信息,分析出到底想访问哪个文件,
        // 发过来的HTTP请求应该是三部分。

        String request[] = inputContent.split(" ");
        if (request.length != 3) {
            sendError(400, "Client invoke error");
            return null;
        }
        // 第一部分是请求的方法
        String method = request[0];
        // 第二部分是请求的文件名
        String fileName = request[1];
        // 第三部分是HTTP版本号
        String httpVersion = request[2];
        System.out.println("Method: " + method + ", file name: " + fileName + ", HTTP version: " + httpVersion);
        return fileName;
    }

    /**
     * 处理调用一个文件的请求
     */
    public void readFile(String fileName) throws IOException {
        File file = new File(Processor.WEB_ROOT + fileName);
        if (!file.exists()) {
            sendError(404, "File Not Found");
            return;
        }
        // 把文件的内容读取到in对象中。
        InputStream in = new FileInputStream(file);
        byte content[] = new byte[(int) file.length()];
        in.read(content);
        out.println("HTTP/1.0 200 sendFile");
        out.println("Content-length: " + content.length);
        out.println();
        out.write(content);
        out.flush();
        out.close();
        in.close();
    }

    /**
     * 发送错误的信息
     */
    public void sendError(int errNum, String errMsg) {
        out.println("HTTP/1.0 " + errNum + " " + errMsg);
        out.println("Content-type: text/html");
        out.println();
        out.println("<html>");
        out.println("<head><title>Error " + errNum + "--" + errMsg + "</title></head>");
        out.println("<h1>" + errNum + " " + errMsg + "</h1>");
        out.println("</html>");
        out.println();
        out.flush();
        out.close();
    }
}

 

2.webserver.java

package webbook.chapter2;

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;

public class WebServer {
    /** 默认使用的服务器Socket端口号 */
    public static final int HTTP_PORT = 8080;
    private ServerSocket serverSocket;

    public void startServer(int port) {
        try {
            serverSocket = new ServerSocket(port);
            System.out.println("Web Server startup on  " + port);
            while (true) {
                Socket socket = serverSocket.accept();
                // 通过线程的方式来处理客户的请求
                new Processor(socket).start();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * WebServer类的启动方法,可以通过命令行参数指定当前Web服务器所使用的端口号。
     */
    public static void main(String[] argv) throws Exception {
        WebServer server = new WebServer();
        if (argv.length == 1) {
            server.startServer(Integer.parseInt(argv[0]));
        } else {
            server.startServer(WebServer.HTTP_PORT);
        }
    }
}

 简单webserver 充当的作用就是接受客户端程序发过来的请求,根据请求内容转换的数据找到自己制定路径下的文件,将其文件转为流返回客服端,这个过程所用的协议为http。

 

第1章 手写WebServer 手写WebServer 阅读详情

相关推荐

java实现web server功能

本资源使用Java实现一个简单的web server功能,并且附带所要解析的文件(一个有关表白的程序)和使用说明

webserver java_java实现简单webserver(分析+源码)

在日常的开发中,我们用过非常多开源的webserver,比如tomcat、apache等等。如今我们自己实现一个简单的webserver,主要的功能就是用户点击要訪问的资源,server将资源发送到client的浏览器。为了简化操作。这里不考虑资源不存在等异常情况。web服务基于的是HTTP协议。用户在浏览器的地址栏输入要訪问的地址,server怎样得到该地址是个关键。先看下一般的HTTP请求和响...

weixin_35891787的博客 921

java实现Webserver

绝对可行,巾帼本人一番调试,终于可用了。 不可用。你发帖骂我。

使用Java实现一个最简单的Web Server

Hello Web ServerWeb Server没有你想象的那么难实现(当然要实现一个好的Java Web Server还是很有难度的)。你只要明白基本的HTTP协议,TCP编程和IO知识。当然,你也要会最简单的HTML代码。我们先来一个屌丝版,这个屌丝版能显示Hello Web Serverpackage exec.network.webserver;import java.io.Buffer

酱油能码丁 2万+

WINDOW环境下用JAVA实现WEB服务器_MultiWebServer.java

WINDOW环境下用JAVA实现WEB服务器_MultiWebServer.java (1)处理一个http请求 (2)接收并解析http请求 (3)从服务器文件系统中获得被请求的文件 (4)创建一个包括被请求的文件的http响应信息 直接发送该信息到客户端

javawebserver

实现一个javawebservice的接受案例

Java项目——简单的WebServer(一)

JavaSE的学习暂时告一段落,老师在学习结束后带着我们做了一个小项目来总结和拓展已经学了的相关知识。 项目内容为模仿tomcat服务器做一个简单的WebServer,要求能返还浏览器发出的请求,并实现一些简单的功能。由于是B/S结构,所以只需要写服务端,客户端用浏览器就可以了 下面先对网络方面的知识做一个简单的介绍:1. 计算机网络计算机网络由一组通过通信信道(Communication ch

Lucifer的博客 4489

树莓派计算模块摄像头连接与配置全攻略:从硬件跳线到软件驱动

在嵌入式视觉项目中,摄像头模组的连接与驱动是图像采集和视频分析的基础。其核心原理是通过CSI-2高速串行接口协议传输图像数据,并依赖I2C总线进行传感器寄存器配置。这一技术方案的价值在于为工业控制、机器人等嵌入式设备提供了稳定、高性价比的视觉感知能力。在实际应用中,开发者常面临摄像头无法识别、I2C通信失败等挑战,尤其是在使用树莓派计算模块时,其硬件接口需要通过I/O板引出,配置过程涉及设备树参数调整等关键步骤。本文聚焦于解决这些实际问题,详细拆解了从硬件连接到软件驱动的完整流程,特别是针对CM4、CM3+

weixin_29184075的博客 337

编写一个WebServer

文章目录基础知识(1)简介(1)反射(3)XML解析1.XML2.SAX解析3.SAX解析服务器配置文件 基础知识 (1)简介 上网浏览网页,离不开服务器,客户请求页面,服务器响应内容,响应的内容是根据每个web请求来产生动态内容的,其内部即启动多个线程来产生不同内容。这种请求响应式的交互,都是基于HTTP协议的。 (1)反射 反射Reflection: 把java类中的各种结构(方法、属性、构造...

ReverieZH的博客 802

Linux下搭建J-Link调试环境:OpenOCD+GDB实战指南

嵌入式开发中,调试器是连接开发主机与目标硬件的关键桥梁,其核心原理是通过标准协议(如JTAG/SWD)访问芯片内部的调试模块。GDB作为通用的调试客户端,通过远程协议与调试服务器通信,而OpenOCD则扮演了协议转换与硬件驱动的角色,实现了调试命令的翻译与执行。这种开源工具链的组合,为开发者提供了高度的定制化与自动化能力,尤其适合需要与持续集成流程深度结合的复杂项目。在实际应用中,针对特定芯片(如ARM7TDMI)进行正确的内存控制器与时钟初始化是成功调试的前提,这常常涉及对板级支持包的深入理解。本文以S3

weixin_29889665的博客 333

保姆级教程:用Jetson Orin Nano和ROS2 Humble搞定PIXhawk 4飞控通信(含配置文件详解)

本文提供了一份详细的Jetson Orin Nano与PIXhawk 4飞控通信配置指南,涵盖硬件连接、ROS2 Humble环境搭建、MAVROS2配置及通信调试全流程。通过实战案例和配置文件详解,帮助开发者快速实现无人机上位机与飞控的稳定通信,适用于无人机开发与自动化控制场景。

weixin_33670786的博客 475

一个简易的WebServer实现

手把手教你撸出一个简易的Web服务器, 理解浏览器与服务器的交互过程。

HeapStackk的博客 1122

CH341的I2C流模式(StreamI2C)到底怎么用?从EEPROM读写到自定义设备,一篇讲清参数配置逻辑

本文详细解析了CH341的I2C流模式(StreamI2C)的使用方法,从EEPROM读写到自定义设备的参数配置逻辑。通过深入分析I2C协议基础、StreamI2C参数映射关系及典型设备配置示例,帮助开发者快速掌握StreamI2C的应用技巧,解决实际开发中的常见问题。

weixin_30932215的博客 452

WebServer

WebServer前言1.HTTP协议之请求数据2.代码分析与实现WebServer解析请求信息WebServer解析请求代码实现代码重构之解析请求信息:WebServer和ClientHandler代码实现WebServer:ClientHandler:?????????????????????3.代码重构之连接池:WebServer代码实现4.处理请求信息:HttpRequestHttpRequest代码结构重构代码之分离请求信息:ClientHandler和HttpRequest代码实现ClientH

qq_41765518的博客 736

避免踩坑!杰理AC63蓝牙名修改常见问题及解决方案(含BLE后缀处理)

本文详细解析了杰理AC63蓝牙设备名称修改的全过程,包括基础操作、BLE后缀处理及高级调试技巧。针对蓝牙名修改中的常见问题,提供了实用的解决方案和代码示例,帮助开发者避免踩坑并实现高效定制。

q6r7s8t9的博客 414

Python量化交易:主流回测框架Backtrader入门详解

Python量化交易框架Backtrader入门指南 Backtrader是一个功能强大的Python量化回测框架,可以帮助交易者专注于策略逻辑而非基础设施。本文介绍了Backtrader的核心架构和使用方法: 框架优势:自动处理订单执行、手续费、滑点、仓位管理等复杂问题,采用事件驱动模式接近真实交易场景。 核心组件: Cerebro:控制中心 Strategy:交易策略 Data Feed:数据输入 Broker:模拟经纪商 Indicators:技术指标 使用流程: 安装:pip install bac

Science prince的博客 936

Stepic Java Webserver 项目教程

Stepic Java Webserver 项目教程 1. 项目的目录结构及介绍 stepic_java_webserver/ ├── LICENSE ├── README.md ├── gitignore ├── L1_1_Simple_web_server/ ├── L2_1_Authorization/ ├── L3_1_JDBC/ ├── L3_2_ORM/ ├── L4_1_WebSoc...

gitblog_01104的博客 381

反应动力学仿真软件:Kintecus_(3).Kintecus安装与配置

在本节中,我们将详细介绍如何安装和配置Kintecus反应动力学仿真软件。Kintecus是一款功能强大的工具,用于模拟和分析化学反应的动力学过程。正确安装和配置软件是开始使用它的第一步。我们将分步骤介绍软件的安装过程,并提供一些基本配置的示例。

kkchenjj的博客 1556

手动编写WebServer

反射Reflection 反射是指把Java类中的各种结构(方法,属性,构造器,类名)映射成一个个的Java对象。利用反射可以对一个类进行解剖,反射是框架技术的灵魂。存在角色反转。 反射:1 获取Class对象; *获取对象的3种方式 *1 对象.getClass() *2 类.class * 3 Class.forName(“包名.类名”) 2 动态创建对象 XML解析 XML:Extensib...

qq_35383654的博客 225

【瑞芯微px30】【RTL8363】【一】驱动移植-网卡驱动概述

linux rtl8363驱动移植

weixin_34799243的博客 1182

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Java 基础学习(二十)Maven、XML与WebServer

1.1.1 Maven概述Maven是一种流行的构建工具,用于管理Java项目的构建,依赖管理和项目信息管理。它使用XML文件来定义项目结构和构建步骤,并使用插件来执行各种构建任务。Maven可以自动下载项目依赖项并管理它们的版本,从而使开发人员能够更轻松地创建和维护Java应用程序。依赖管理:Maven可以自动下载和管理项目依赖项,从而简化了构建和部署过程插件系统:Maven提供了一个强大的插件系统,使开发人员可以轻松地扩展和自定义构建过程。

2301_79227925的博客 997

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

盘点JAVA程序猿必备的webserver

apache作为apache公司的元老级webserver,由他的独特之处:比如响应速度快,可以运行一年不重启等优点,而且兼容性强,可以安装各种插件,实现多种本身不具有的功能。一般而言,要从工程师进化为构架师,一个合格的java工作者需要掌握一些关于构架的知识, 比如互联网的结构,服务器的建设,负载均衡的问题以及高并发系统的选择与解决。展开点说, 我们现在网上的内容都是建立在一个网站服务器保存好的内容之上的,要想调度和浏览这些网页,就需要web服务器来进行操作,你才可以看到别人服务器上面的内容。

Mr_HelloWorldx的博客 1560

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

webserver学习记录

下载项目在有(makefile)的文件夹里make(编译链接能够生产用源文件)CMakefile.txt是cmake,本质上是运行一个跨系统软件帮忙编写makefile。

qq_53345398的博客 326
上一篇: 乒乓球技术
下一篇: 三星 盖世3 刷CM10.2 请插入sim卡
O2AtomLife
博客等级 码龄19年 2粉丝 82原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值