上节课大概介绍了一下HTTP协议。我们写了一个很简单的web server。上一节课有很多朋友表示还有很多疑惑,从今天起,我们来写一个简单的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;}@Overridepublic 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 文件的内容读出来,如果文件中还引用了图片,例如<img>标签,那么服务器还会去读取这个图片将其发送到客户端。

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

可是,只有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:

<head><title>first active page</title></head><body><h1>Hello World!</h1><h2>Hello World!</h2><h3>Hello World!</h3><h4>Hello World!</h4><h5>Hello World!</h5><h6>Hello World!</h6></body>

在浏览器里输入localhost:8080/index.html

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

<head><title>first active page</title></head><body><%for (int i = 6; i > 0; i--) {out.println("<h" + i + ">Hello World!</h" + i + ">");}%></body>

我们在浏览器里访问一下这个网址:

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

大家回想一下这个过程,浏览器将 GET index.jsp 的请求发送到 jetty 服务器,服务器看到这个请求以后,把 jsp 中的脚本拿出来执行,将 JSP 翻译成 html,然后再把这些 html 文本发送回客户端。这个过程与我们上一节课讲的过程是一模一样的,唯一的不同就是 Jetty 还要负责进行脚本的解释。

今天的课程就到这里吧。

上一课:Http协议

下一课:Java Web Server(2): JSP

课程目录:课程目录

分类: 教程分享 标签: 暂无标签

评论

暂无评论数据

暂无评论数据

目录