最简单的web服务器实现(一)

简介: tomcat作为web服务器,想必大家做过web开发的都离不开tomcat了,值得庆幸的是tomcat也是开放源代码的,最近准备好好琢磨琢磨tomcat的源码,还没开始就已经感觉到不少的未知恐惧了,慢慢来把。
tomcat作为web服务器,想必大家做过web开发的都离不开tomcat了,值得庆幸的是tomcat也是开放源代码的, 最近准备好好琢磨琢磨tomcat的源码,还没开始就已经感觉到不少的未知恐惧了,慢慢来把。
可能我的学习方式比较急功近利,但是这种方式收效也快,自己记得在>里作者写过一个最简单的web服务器实现,自己在网上也比较了一下其它的版本,还是感觉那本书里的版本比较好,在此分享出来,因为时间紧,照着书敲了一遍代码,竟然发现里面有一些很细小的错误,自己准备在这个基础上好好改进一把。
首先来看看web服务器的一些基本原理,我们的实验是基于socket的,开放了一个指定的端口,然后会启用对应的线程来处理浏览器中的请求。如果文件不存在,会报出404错误,否则会解析文件的内容。
HttpServer类是后台服务类,会开放对应的端口和socket来处理浏览发出的请求。
HttpThread类是接受浏览器发送请求的类,通过Receive和Answer来接受和处理浏览器发送的请求,然后返回到客户端中。

点击(此处)折叠或打开

  1. package new_test;
    import java.io.IOException;
    import java.net.ServerSocket;
    import java.net.Socket;
    public class HttpServer { 
    public static String ROOT="./wwwroot";
    public static String defaultPage="index.html";

        public static void main(String[] args) throws IOException{ 
            
                ServerSocket ss = new ServerSocket(8080); 
                while(true){
                Socket s=ss.accept();
                    System.out.println("Accept Connection...:");                                   
                     new HttpThread(s).start();
                }        
        } 
    }



点击(此处)折叠或打开

  1. package new_test;


    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import
    } java.net.Socket;


    public class HttpThread extends Thread {


    private Socket socket;


    public HttpThread(Socket s) {
    this.socket = s;


    public void run() {
    InputStream ins = null;
    OutputStream ous = null;
    try {
    ous = socket.getOutputStream();
    ins = socket.getInputStream();
    Receive rcv = new Receive(ins);
    String sURL = rcv.parse();
    System.out.println("sURL is " + sURL);


    if (sURL.equals("/")) {
    sURL = HttpServer.defaultPage;
    }
    Answer ans = new Answer(ous);
    ans.send(sURL);
    } catch (IOException e) {
    e.printStackTrace();
    } finally {
    try {
    if (ins != null) {
    ins.close();
    }
    if (ous != null) {
    ous.close();
    }
    if (socket != null) {
    socket.close();
    }
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }
    }

点击(此处)折叠或打开

  1. package new_test;


    import java.io.IOException;
    import java.io.InputStream;


    public class Receive {
    InputStream in = null;


    public Receive(InputStream ins) {
    this.in = ins;
    }


    public String parse() {
    StringBuffer receiveStr = new StringBuffer(2048);
    int i ;
    byte[] buffer = new byte[2048];
    try {
    i = in.read(buffer);
    } catch (IOException e) {
    i = -1;
    }
    for (int j = 0; j receiveStr.append((char)buffer[j]);


    }
    return getUri(receiveStr.toString());
    }


    private String getUri(String receiveStr) {
    int index1, index2;
    System.out.println("receiveStr is " + receiveStr);
    index1 = receiveStr.indexOf(" ");
    if (index1 != -1) {
    index2 = receiveStr.indexOf(" ", index1 + 1);
    if (index2 > index1) {
    return receiveStr.substring(index1 + 1, index2);
    }
    }
    return null;
    }


    }





点击(此处)折叠或打开

  1. package new_test;


    import java.io.File;
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.OutputStream;


    public class Answer {
    OutputStream out = null;


    public Answer(OutputStream ous) {
    this.out = ous;
    }


    public void send(String pageFile) {
    byte[] bytes = new byte[2048];


    FileInputStream fis = null;
    try {
    File file = new File(HttpServer.ROOT, pageFile);
    if (file.exists()) {


    fis = new FileInputStream(file);
    int ch = fis.read(bytes, 0, 2048);
    String sBody = new String(bytes, 0);
    String sendMessage = "HTTP/1.1 200 OK\r\n"
    + "Content-Type:text/html\r\n" + "Content-Length:" + ch
    + "\r\n" + "\r\n" + sBody;
    out.write(sendMessage.getBytes());
    } else {
    String errorMessage = "Http/1.1 404 File NOT FOUND\r\n"
    + "Content-Type:text/html\r\n"
    + "Content-Length:23\r\n" + "\r\n"
    + "

    File Not Found

    ";
    out.write(errorMessage.getBytes());
    }
    } catch (IOException e) {
    e.printStackTrace();
    } finally {
    if (fis != null) {
    try {
    fis.close();
    } catch (IOException e) {
    e.printStackTrace();
    }
    }
    }


    }


    }


一个简单调用的情况就是,如果不存在对应的页面会直接抛出File Not Found的错误信息

目录
相关文章
|
1月前
|
存储 资源调度 应用服务中间件
浅谈本地开发好的 Web 应用部署到 ABAP 应用服务器上的几种方式
浅谈本地开发好的 Web 应用部署到 ABAP 应用服务器上的几种方式
23 0
|
2月前
计算机网络:思科实验【1-访问WEB服务器】
计算机网络:思科实验【1-访问WEB服务器】
计算机网络:思科实验【1-访问WEB服务器】
|
27天前
|
网络协议 Shell 网络安全
实验目的1.编译安装httpd2.优化路径3.并将鲜花网站上传到web服务器为网页目录4.在客户机访问网站http://www.bdqn.com
实验目的1.编译安装httpd2.优化路径3.并将鲜花网站上传到web服务器为网页目录4.在客户机访问网站http://www.bdqn.com
161 0
|
20天前
|
前端开发 应用服务中间件 nginx
使用Docker快速搭建Web服务器Nginx
本文指导如何使用Docker快速搭建Nginx服务器。首先,通过`docker pull`命令获取Nginx镜像,然后以容器形式运行Nginx并映射端口。通过挂载目录实现本地文件与容器共享,便于自定义网页。使用`docker ps`检查运行状态,访问IP:8088确认部署成功。最后,介绍了停止、删除Nginx容器的命令,强调Docker简化了服务器部署和管理。
36 0
|
1月前
|
Windows
Windows Server 各版本搭建 Web 服务器实现访问本地 Web 网站(03~19)
Windows Server 各版本搭建 Web 服务器实现访问本地 Web 网站(03~19)
50 2
|
1月前
|
机器学习/深度学习 Python
Python基础:构建一个简单的Web服务器
Python基础:构建一个简单的Web服务器
36 1
|
1月前
|
应用服务中间件 Apache nginx
web后端-web服务器对比
web后端-web服务器对比
|
1月前
|
Unix 应用服务中间件 Apache
常用Web服务器
常用Web服务器。
30 1
|
2月前
|
安全 网络安全 开发者
如何在OpenWRT部署uhttpd搭建服务器实现远程访问本地web站点
如何在OpenWRT部署uhttpd搭建服务器实现远程访问本地web站点
87 0
|
10天前
|
监控 JavaScript 前端开发
《理解 WebSocket:Java Web 开发的实时通信技术》
【4月更文挑战第4天】WebSocket是Java Web实时通信的关键技术,提供双向持久连接,实现低延迟、高效率的实时交互。适用于聊天应用、在线游戏、数据监控和即时通知。开发涉及服务器端实现、客户端连接及数据协议定义,注意安全、错误处理、性能和兼容性。随着实时应用需求增加,WebSocket在Java Web开发中的地位将更加重要。