我们到底能走多远系列(8)

我们到底能走多远系列(8)

扯淡:

  我们到底能走多远?是想提醒自己不要停止学习和博客的更新,这个系列会一直和web开发有关,我的目标是写完100个。慢慢来,阶段性目标15个吧。哈哈

  学得好不如做的好,做得好不如扯得好啊!

主题:

  在上一轮学习中:Servlet-我们到底能走多远系列(7) 发现要想理解web中的servlet,还是需要深入学习servlet 容器:tomcat(因为它是开源的嘛!)

  为了不迷失在tomcat茫茫的源码中,我先学习下最外围的一些知识,然后先把《How Tomcat Works 》第一章看了。有人评论说这本书就是代码太多,我到很喜欢这个写作风格,程序员嘛,代码就是我们的文章!

  HTTP(Hypertext Transfer Protocol):

    想要自己看http消息可以利用抓包工具比如wireshark来抓取http消息。(wireshark是一个很不错的抓包工具,界面也蛮漂亮的,功能强大。)    官方下载:

    访问网站时抓到的包:包括了request 和 response(没有包括body部分)

    详细的http协议的学习可以查看:

    其中关于method的get还是post可以查看:

一个简单的webServer:

  知道了http消息的格式,就可以来学习下《How Tomcat Works 》第一章提供的代码了

分成3部分:

HttpServer :负责监听服务器的端口,将监听到的消息交给Request处理,然后实例特定的Response返回除去。

Request :负责把http消息中的Uri取出来。

Response :根据Request取得的Uri,到到响应的文件中读取内容,把内容返回出去。

上面的整个流程基本完成了响应 – 返回的效果。

HttpServer:

package code.tomcat.simpleWebServer;import java.io.File;import java.io.IOException;import java.io.InputStream;import java.io.OutputStream;import java.net.InetAddress;import java.net.ServerSocket;import java.net.Socket;public class HttpServer {String WEB_ROOT = System.getProperty(“user.id”) + File.separator + “webroot”;String SHUTDOWN_COMMAND = “/SHUTDOWN”;isShutdown = false; main(String[] args) {HttpServer httpSever = new HttpServer();// 不能叫wait,你懂的httpSever.await();}private void await(){ServerSocket serverSocket = null;int port = 8080;try {// 用ServerSocket等待端口消息serverSocket = new ServerSocket(port, 1, InetAddress.getByName(“127.0.0.1”));} catch (IOException e) {e.printStackTrace();System.exit(1);//异常后,把java虚拟机都关掉}while( ! isShutdown ){Socket socket = null;InputStream input = null;OutputStream output = null;try {// 建立socketsocket = serverSocket.accept();// socket的输入input = socket.getInputStream();// socket的输出output = socket.getOutputStream();Request request = new Request(input);request.parse();//Request来解析出uriResponse response = new Response(output);response.setRequest(request);//把Request放进去,是要用解析出来的uriresponse.sendStaticResource();//把产生的返回内容发送出去// 关闭socketsocket.close();isShutdown = request.getUri().equals(SHUTDOWN_COMMAND);} catch (IOException e) {e.printStackTrace();continue;}}}}

Request :

package code.tomcat.simpleWebServer;import java.io.IOException;import java.io.InputStream;public class Request {private InputStream input;private String uri;public Request(InputStream input) {this.input = input;}public void parse() {StringBuffer request = new StringBuffer(2048);int i;byte[] buffer = new byte[2048];try {// 把InputStream读出来,放进byte[2048]大小的buffer中i = input.read(buffer);} catch (IOException e) {e.printStackTrace();i = -1;}(int j = 0; j < i; j++) {request.append((char) buffer[j]);}// 然后再以String的形式传经解析方法中去uri = parseUri(request.toString());} String parseUri(String requestString) {int index1, index2;// 第一个空格位置index1 = requestString.indexOf(‘ ‘);if (index1 != -1) {// 第二个空格位置index2 = requestString.indexOf(‘ ‘, index1 + 1);if (index2 > index1)requestString.substring(index1 + 1, index2);}return null;}public String getUri() {return uri;}}

Response :

穿越茫茫人海,寻找属于我们的那一份宁静。

我们到底能走多远系列(8)

相关文章:

你感兴趣的文章:

标签云: