Java Web Server(1): 基础篇 海纳

今天起,我们来写一个简单的web server,争取把这些疑惑都能解决了。

一个不退出的Web Server
上节课留的作业是让读者自己实现一个server,可以在客户端请求结束以后,不必退出。评论区有人说可以使用线程,这确实是一个最简单的方案。我们来实现一个:

public class TcpServer {
public static void main(String[] args) {
try {
ServerSocket ss = new ServerSocket(80);
Socket socket = ss.accept();

        while (socket != null) {
            new ClientConnection(socket).start();
            socket = ss.accept();
        }

        ss.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}
这个ClientConnection是一个新的线程,每次有一个新的连接进来的时候就会新起一个线程,专门负责与那个客户端通讯。这样的话,我们的服务端就有能力同时处理多个请求了。

ClientConnection的具体实现如下:

public class ClientConnection extends Thread{
Socket socket;

public ClientConnection(Socket socket) {
    this.socket = socket;
}

@Override
public void run() {
    try {
        BufferedReader br = new BufferedReader(new InputStreamReader(socket.getInputStream()));

        String s = null;
        while ((s = br.readLine()) != null && !s.equals(""))
            System.out.println(s);

        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
        bw.write("HTTP/1.1 200 OK\n");
        bw.write("Content-Type: text/html; charset=UTF-8\n\n");
        bw.write("<html>\n" +
                "<head>\n" +
                "    <title>first page</title>\n" +
                "</head>\n" +
                "<body>\n" +
                "    <h1>Hello World!</h1>\n" +
                "</body>\n" +
                "</html>\n");
        bw.flush();

        br.close();
        bw.close();
        socket.close();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

}
解析HTTP报文
服务端在接收到http报文之后,要对此报文进行分析。如果所请求的网页不存在,则要向客户端返回404状态,只有请求的网页(当然也可以是其他资源)存在的时候才能向客户端返回正确的内容。

上节课,我们已经看到http协议 GET 方法的格式了。我们来写一个可以分析http协议的处理器。具体的代码比较多,也很杂,我这里就不贴了。其实,主要就是一个字符串的分析过程。留给读者自己练手吧。

动态网页和静态网页
我们知道早期的互联网的网页是使用 html 来制作的静态网页,这个网页在制作的时候是什么内容,服务器就把这个 html 文件的内容读出来,如果文件中还引用了图片,例如标签,那么服务器还会去读取这个图片将其发送到客户端。

但是随着互联网的发展,这种仅能用于展示的静态网页很快就不能满足需求了。例如,我们做一个网站,有账号系统,有网站数据,那么这些数据就需要存储到数据库里。

可是,只有HTML显然是没办法连接数据库,进行增删改的。那怎么办呢?于是,动态网页脚本就出现了。2000年左右,开发网站还处在上古时期,没有那么多的思想,什么MVC,SOA,微服务都没有,比较流行的,就是是直接把 html 与脚本混编的。

这个时期比较流行的有,asp,php,jsp等技术。我这里以一个原始的JSP网页举一个例子,展现一下脚本的作用。

先去下载一个最新版的jetty来,我们通过jetty来进行实验,在这里下载一个。

Jetty - Servlet Engine and Http Server

然后把它解压以后,进入根目录。根目录下有一个start.jar文件,我们使用java命令运行它。

java -jar start.jar
不过,在这之前,我们还是要在webapps这个文件夹下创建一个名为root的文件夹,并且在这个里面创建一个index.html:

first active page
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
Hello World!
在浏览器里输入localhost:8080/index.html

可以看到效果,我就不截图了,比较简单。这想的重复代码,我们要是能动态生成就好了。这就是动态网页的优点了,通过在网页中内嵌脚本,让它自动生成。我们在root文件夹下面再新建一个index.jsp:

first active page <% for (int i = 6; i > 0; i--) { out.println("

我们可以看到通过 jsp 的内嵌脚本,生成了一个完整的 html 文件。

大家回想一下这个过程,浏览器将 GET index.jsp 的请求发送到 jetty 服务器,服务器看到这个请求以后,把 jsp 中的脚本拿出来执行,将 JSP 翻译成 html,然后再把这些 html 文本发送回客户端。这个过程与我们上一节课讲的过程是一模一样的,唯一的不同就是 Jetty 还要负责进行脚本的解释。
还有就是这我总结出了一些架构视频资料和互联网公司java程序员面试涉及到的绝大部分面试题和答案做成了文档和架构视频资料还有完整高清的java进阶架构学习思维导图免费分享给大家(包括Dubbo、Redis、Netty、zookeeper、Spring cloud、分布式、高并发等架构技术资料),希望能帮助到您面试前的复习且找到一个好的工作,也节省大家在网上搜索资料的时间来学习。
在这里插入图片描述
料领取方式:加群:374308445填写【CSDN 资料】即可免费获取!!!
如果您喜欢本文章,可以点击关注,每天将有更多精彩文章与您分享!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值