java实现web服务器.pdf
《java实现web服务器.pdf》由会员分享,可在线阅读,更多相关《java实现web服务器.pdf(32页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、 java 实现 web 服务器 2 作者:日期:个人收集整理 勿做商业用途 3 java 实现 web 服务器。txt 明骚易躲,暗贱难防。佛祖曰:你俩就是大傻 B!当白天又一次把黑夜按翻在床上的时候,太阳就出生了一个 Web 服务器也被称为 HTTP 服务器,它通过 HTTP 协议与客户端通信.这个客户端通常指的是 Web 浏览器。一个基于 Java 的 Web 服务器用到二个重要的类,java。net。Socket 与 。ServerSocket,并通过 HTTP 消息通信。因此,本文从讨论 HTTP 与这二个类开始,然后我将解释一个与本文相关的简单的 Web 应用。The Hypert
2、ext Transfer Protocol(HTTP)HTTP 是一种让 Web 服务器与浏览器(客户端)通过 Internet 发送与接收数据的协议。它是一个请求、响应协议客户端发出一个请求,服务器响应这个请求。HTTP 运用可靠的 TCP 连接,通常用的 TCP 80 端口。它的第一个版本是 HTTP/0。9,然后被 HTTP/1。0 取代.当前的版本是 HTTP/1。1,由 RFC2616(.pdf)定义。本节主要对应 HTTP 1。1,足够使你充分理解由 Web 服务器程序发出的消息。如果你对更加详细的知识有兴趣,可以参考 RFC2616。在 HTTP 中,客户端总是通过建立一个连接与
3、发送一个 HTTP 请求来发起一个事务。服务器不能主动去与客户端联系,也不能给客户端发出一个回叫连接。客户端与服务器端都可以提前中断一个连接。例如,当用一个浏览器下载一个文件时,你可以通过点击“停止”键来中断文件的下载,关闭与服务器的 HTTP 连接.HTTP 请求 一个 HTTP 请求包含三个部分:MethodURI-Protocol/Version 方法地址版本 Request header 请求头 Entity body 请求实体 下面是一个 HTTP 请求实例:POST/servlet/default。jsp HTTP/1.1 个人收集整理 勿做商业用途 4 Accept:text/p
4、lain;text/html Accept-Language:en-gb Connection:KeepAlive Host:localhost Referer:http:/localhost/ch8/SendDetails.htm User-Agent:Mozilla/4。0(compatible;MSIE 4.01;Windows 98)Content-Length:33 Content-Type:application/x-wwwform-urlencoded Accept-Encoding:gzip,deflate LastName=Franks&FirstName=Michael T
5、he Method-URIProtocol/Version 在这个请求的第一行:POST/servlet/default。jsp HTTP/1。1 其中 POST 是请求的类型。每个客户端 HTTP 请求可以是 HTTP 规范中指定的许多请求类型中的一种。HTTP 1.1 支持七种类型的请求,它们是 GET,POST,HEAD,OPTIONS,PUT,DELETE,TRACE。其中 GET 与 POST 是 Internet 应用中经常用到的二种请求类型。URI 完整地指定了 Internet 资源。一个 URI 通常被解析为相对服务器的根目录。这样,它应该总是以一个/前缀开始。一个 URL
6、实际上是 URI 的一种类型。Version 指的是该 HTTP 请求所用到的 HTTP 协议版本。请求头包含了客户端环境与请求实体的一些有用的信息。例如它包含浏览器设定的语言、个人收集整理 勿做商业用途 5 实体的长度等等。每条请求头用回车换行符(CRLF)分开.一个非常重要的空行分开了请求头与实体,它标志着实体内容的开始.一些 Internet 开发书籍认为这个 CRLF 空行是 HTTP 请求的第四个部分。在上面的 HTTP 请求中,实体只是简单以下的一行:LastName=Franks&FirstName=Michael 在一个典型的 HTTP 请求中,请求实体内容会长得多.HTTP
7、响应 与请求相似,HTTP 响应也由三部分组成:ProtocolStatus codeDescription 协议状态 描述代码 Response headers 响应头 Entity body 响应实体 以下是一个 HTTP 响应的实例:HTTP/1。1 200 OK Server:MicrosoftIIS/4。0 Date:Mon,3 Jan 1998 13:13:33 GMT Content-Type:text/html LastModified:Mon,11 Jan 1998 13:23:42 GMT 个人收集整理 勿做商业用途 6 Content-Length:112 Welcome
8、 to Brainy Software 响应头的第一行类似请求头的第一行,告诉你所用的协议是 HTTP 1.1,请求成功(200=success),以及没有任何问题。响应头类似请求头也包含了一些有用的信息。响应的实体响应本身的 HTML 内容。头与实体之间由回车换行的空行(CRLF)分开。Socket 类 一个 socket 是一个网络连接的端点,它使得一个应用可以从网络读与写。在不同电脑上的二个应用软件能够通过收发字节流而彼此通信。要发一个信息到另一个应用程序,你需要知道它的 IP 地址,以及它的 socket 端口号.在 Java 中,一个 socket 用 java。net.Socket
9、 来实现。要创建一个 socket,你可以用 Socket 类中几个构建方法中的一个。其中一个接受主机名与端口号作为参数:new Socket(”,80);一旦你成功地创建了一个 Socket 类的实例,你就可以用它去发送与接收字节流了。要发送字节流,你需要呼叫 Socket 类的 getOutputStream 方法来得到一个 java。io.OutputSteam 对象。要发送文本到远程的程序,你通常需要从返回的 OutputStream 创建一个 java.io.PrintWriter 对象.要从连接的另一端接收字节流,你需要呼叫 Socket 类的 getInputStream 方法,
10、它返回一个 java。io.InputStream 对象。个人收集整理 勿做商业用途 7 以下代码创建一个可以与本地 HTTP 服务器通信的 socket(127。0。0。1 表示一个本地的主机),发送一个 HTTP 请求,并接收从服务器的响应.它还创建一个 StringBuffer 对象来接受响应,并打印到控制台。Socket socket=new Socket(”127.0。0。1,”8080);OutputStream os=socket。getOutputStream();boolean autoflush=true;PrintWriter out=new PrintWriter(so
11、cket。getOutputStream(),autoflush);BufferedReader in=new BufferedReader(new InputStreamReader(socket.getInputStream()));/send an HTTP request to the web server out。println(”GET/index.jsp HTTP/1.1”);out.println(Host:localhost:8080);out。println(Connection:Close);out.println();/read the response boolean
12、 loop=true;StringBuffer sb=new StringBuffer(8096);while(loop)if(in.ready()int i=0;个人收集整理 勿做商业用途 8 while(i!=-1)i=in.read();sb。append((char)i);loop=false;Thread.currentThread()。sleep(50);/display the response to the out console System.out.println(sb.toString());socket.close();注意要从 web 服务器得到正确的响应,你必须要发
13、送用 HTTP 协议编译了的 HTTP 请求。如果你看了上面的 HTTP 部分,你应该能够理解上面代码中的 HTTP 请求。编者注:这篇文章节选自 budi 自己出版的书Tomcat 内幕。你可以在他的网站得到更多的相关资料。基于 Java 的 Web 服务器工作原理 2 作者:fajaven 译 发文时间:2003。09。12 17:00:38 ServerSocket 类 Socket 类描述的是“客户端”socket,当你需要创建与远程服务程序连接时需要用到它。如果你想实现一个服务程序,如 HTTP 服务器或者 FTP 服务器,则需要另外不同的方法。这是因为你的服务器必须随时服务,它不知
14、道什么时候会有一个客户端程序需要连接它。个人收集整理 勿做商业用途 9 因为这个目的,你需要用到 java。net.ServerSocket 这个类,它是服务器端 socket 的一个实现。服务器端 socket 等待来自客户端的连接请求.一旦它收到一个连接请求,它创建一个 socket 实例来与客户端进行通信。要创建服务器端 socket,需要用到 ServerSocket 类提供的四个构建方法中的一个.你需要指定服务器端 socket 侦听的 IP 地址与端口号。比较典型地,这个 IP 地址可以是 127。0。0。1,意思是该服务器端 socket 侦听的是本地机器.服务器端 socket
15、 侦听的 IP 地址指的是绑定地址。服务器端 socket 另一个重要的属性是队列长度,即它拒绝请求前所接受的最大请求排队长度.ServerSocket 类的构建方法之一如下:public ServerSocket(int port,int backLog,InetAddress bindingAddress);对于这个构建方法,绑定地址必须是 .InetAddress 类的实例。创建一个 InetAddress 类的对象的简单方法是呼叫其静态方法 getByName,传递一个包含主机名的字符串.InetAddress.getByName(127.0.0。1”);以下行的代码创建了一个服务器端
16、 socket,它侦听本地机器的 8080 端口,限制队列长度为 1。new ServerSocket(8080,1,InetAddress.getByName(127。0。0。1”);一旦有了一个 ServerSocket 实例,就可以通过呼叫其 accept 方法来让它等待进来的链接请求。这个方法只有当接收到请求时才返回,它返回的是 Socket 类的实例。这个 Socket 对象就可以用来从客户端应用程序发送与接收字节流,正如上节据说的那样。实际上,accept 方法是本文例子中用到的唯一方法。个人收集整理 勿做商业用途 10 应用实例 我 们 的 web 服 务 器 程 序 是 ex0
17、1.pyrmont 包 的 一 部 分,它 包 含 三 个 类:HttpServer;Request;Response。整个程序的入口(静态 main 方法)是 HttpServer 类。它创建一个 HttpServer 的实例,并呼叫其 await 方法。正如名字表达的,await 在一个特定的端口等待 HTTP 请求,处理它们,并返回响应给客户端.它保持等待状态,直到收到停止命令。(用方法名 await 代替 wait,是因为 System 中有一个重要的与线程相关的方法)这个程序只从一个特定的目录发送静态资源,如 HTML 与图像文件。它只支持没有文件头(如日期与 cookie)的情况。
18、现在我们将在如下的几节中看一下这三个类。HttpServer 类 HttpServer 实现了一个 web 服务器,它可以提供(serve)特定目录及其子目录下的静态资源。这个特定的目录由 public static final WEB_ROOT 指定。WEB_ROOT 初始化如下:public static final String WEB_ROOT=System.getProperty(user.dir)+File。separator+webroot;代码列表中包含了一具叫做 webroot 的目录,里面有一些静态的资源,你可以用来测试本应用。你也可以看到一个 servlet,在我的下一篇
19、文章将会被用到:“Servlets 容器是怎样工作的”。为 了 请 求 一 个 静 态 的 资 源,在 浏 览 器 的 地 址 栏 输 入 如 是 地 址:http:/machinename:port/staticResources 如果你从不同的机器上发送请求到运行本应用的机器,则 machinename 是运行应用机器的机器名或 IP 地址,port 是 8080,staticResources 是被请求的文件名称,它必须包含个人收集整理 勿做商业用途 11 在 WEB_ROOT 目录内.例如,如果你用同一台电脑来测试这个应用,你想要 HttpServer 发送 index。html 这个
20、文件,用以下的地址:http:/localhost:8080/index.html 要停止服务,只需要从浏览器发送一个停止(shutdown)命令,即在浏览器的地址栏输入 host:port 字段后,加上预先定义好的字符串。在我们的 HttpServer 类中,停止命令被定义为 SHUTDOWN,一个 static final 变量。private static final String SHUTDOWN_COMMAND=”/SHUTDOWN;因此,要停止服务,你可以这样:http:/localhost:8080/SHUTDOWN 现在,让我们看一下列表 1.1 中给出的 await 方法。代
21、码列表后面将对这段代码做一些解释。Listing 1。1.The HttpServer class await method public void await()ServerSocket serverSocket=null;int port=8080;try serverSocket=new ServerSocket(port,1,InetAddress.getByName(”127。0。0.1”);catch(IOException e)e.printStackTrace();个人收集整理 勿做商业用途 12 System。exit(1);/Loop waiting for a reque
22、st while(!shutdown)Socket socket=null;InputStream input=null;OutputStream output=null;try socket=serverSocket。accept();input=socket。getInputStream();output=socket.getOutputStream();/create Request object and parse Request request=new Request(input);request。parse();/create Response object Response re
23、sponse=new Response(output);response.setRequest(request);response。sendStaticResource();/Close the socket socket。close();个人收集整理 勿做商业用途 13 /check if the previous URI is a shutdown command shutdown=request。getUri().equals(SHUTDOWN_COMMAND);catch(Exception e)e。printStackTrace();continue;await 方法以创建一个 Se
24、rverSocket 实例开始,然后进入一个 while 的循环。serverSocket=new ServerSocket(port,1,InetAddress.getByName(127。0.0.1”));.。/Loop waiting for a request while(!shutdown).。在 while 循环中的代码,运行到 ServerSocket 的 accept 方法即停止。这个方法只有在 8080 端口接收到 HTTP 请求才返回:个人收集整理 勿做商业用途 14 socket=serverSocket。accept();收到请求后,await 方法从 accept 方
25、法返回的 Socket 实例中等到 java。io.InputStream 与 java。io.OutputStream:input=socket.getInputStream();output=socket.getOutputStream();然后 await 方法创建一个 Request 对象,呼叫它的 parse 方法来解析这个原始的 HTTP 请求:/create Request object and parse Request request=new Request(input);request.parse();下一步,await 方法创建一个 Response 对象并把 Reque
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- java 实现 web 服务器
限制150内