鸿 网 互 联 www.68idc.cn

当前位置 : 服务器租用 > 编程语言开发 > java > >

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

来源:互联网 作者:佚名 时间:2012-11-22 14:51
我们到底能走多远系列(8) 扯淡: 我们到底能走多远?是想提醒自己不要停止学习和博客的更新,这个系列会一直和web开发有关,我的目标是写完100个。慢慢来,阶段性目标15个吧。哈哈 学得好不如做的好,做得好不如扯得好啊! 主题: 在上一轮学习中:Servlet-

我们到底能走多远系列(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 { // 建立socket socket = serverSocket.accept(); // socket的输入 input = socket.getInputStream(); // socket的输出 output = socket.getOutputStream(); Request request = new Request(input); request.parse();//Request来解析出uri Response response = new Response(output); response.setRequest(request);//把Request放进去,是要用解析出来的uri response.sendStaticResource();//把产生的返回内容发送出去 // 关闭socket socket.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 :

网友评论
<