选择显示字体大小

基于java的web服务器工作原理(一)

by  budi kurniawan  2003-04-23
翻译作者:-matrix开源技术-fajaven
英文原文:http://www.onjava.com/pub/a/onjava/2003/04/23/java_webserver.html
  
编者注:这篇文章节选自 budi 自己出版的书<tomcat 内幕>。你可以在他的网站得到更多的相关资料。

  一个 web 服务器也被称为 http 服务器,它通过 http 协议与客户端通信。这个客户端通常指的是 web 浏览器。一个基于 javaweb 服务器用到二个重要的类,java.net.socketjava.net.serversocket ,并通过 http 消息通信。因此,本文从讨论 http 与这二个类开始,然后我将解释一个与本文相关的简单的 web 应用。

the hypertext transfer protocol(http)

  http 是一种让 web 服务器与浏览器(客户端)通过 inte.net 发送与接收数据的协议。它是一个请求、响应协议--客户端发出一个请求,服务器响应这个请求。http 运用可靠的 tcp 连接,通常用的 tcp 80 端口。它的第一个版本是 http/0.9 ,然后被 http/1.0 取代。当前的版本是 http/1.1 ,由  rfc2616(.pdf) 定义。

  本节主要对应 http 1.1 ,足够使你充分理解由 web 服务器程序发出的消息。如果你对更加详细的知识有兴趣,可以参考 rfc2616 。

  在 http 中,客户端总是通过建立一个连接与发送一个 http 请求来发起一个事务。服务器不能主动去与客户端联系,也不能给客户端发出一个回叫连接。客户端与服务器端都可以提前中断一个连接。例如,当用一个浏览器下载一个文件时,你可以通过点击“停止”键来中断文件的下载,关闭与服务器的 http 连接。

http 请求

  一个 http 请求包含三个部分:
method-uri-protocol/version  方法-地址-版本
request header  请求头
entity body  请求实体

  下面是一个 http 请求实例:
post /servlet/default.jsp http/1.1
accept: text/plain; text/html
accept-language: en-gb
connection: keep-alive
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-www-form-urlencoded
accept-encoding: gzip, deflate

lastname=franks&firstname=michael

  the method-uri-protocol/version 在这个请求的第一行:
post /servlet/default.jsp http/1.1

  其中 post 是请求的类型。每个客户端 http 请求可以是 http 规范中指定的许多请求类型中的一种。http 1.1 支持七种类型的请求,它们是 get,post,head,options,put,delete,trace。其中 get 与 post 是 inte.net 应用中经常用到的二种请求类型。

  uri 完整地指定了 inte.net 资源。一个 uri 通常被解析为相对服务器的根目录。这样,它应该总是以一个 '/' 前缀开始。一个 url 实际上是 uri 的一种类型。

  version 指的是该 http 请求所用到的 http 协议版本。

  请求头包含了客户端环境与请求实体的一些有用的信息。例如它包含浏览器设定的语言、实体的长度等等。每条请求头用回车换行符(crlf)分开。

  一个非常重要的空行分开了请求头与实体,它标志着实体内容的开始。一些 inte.net 开发书籍认为这个 crlf 空行是 http 请求的第四个部分。

  在上面的 http 请求中,实体只是简单以下的一行:
lastname=franks&firstname=michael

  在一个典型的 http 请求中,请求实体内容会长得多。

http 响应

  与请求相似,http 响应也由三部分组成:
protocol-status code-description  协议状态 描述代码
response headers  响应头
entity body  响应实体

  以下是一个 http 响应的实例:
http/1.1 200 ok
server: microsoft-iis/4.0
date: mon, 3 jan 1998 13:13:33 gmt
content-type: text/html
last-modified: mon, 11 jan 1998 13:23:42 gmt
content-length: 112

<html>
<head>
<title>http response example</title></head><body>
welcome to brainy software
</body>
</html>

  响应头的第一行类似请求头的第一行,告诉你所用的协议是 http 1.1 ,请求成功(200=success),以及没有任何问题。

  响应头类似请求头也包含了一些有用的信息。响应的实体响应本身的 html 内容。头与实体之间由回车换行的空行(crlf)分开。

socket

  一个 socket 是一个网络连接的端点,它使得一个应用可以从网络读与写。在不同电脑上的二个应用软件能够通过收发字节流而彼此通信。要发一个信息到另一个应用程序,你需要知道它的ip地址,以及它的 socket 端口号。在 java 中,一个 socketjava.net.socket 来实现。

  要创建一个 socket ,你可以用 socket 类中几个构建方法中的一个。其中一个接受主机名与端口号作为参数:
new socket(&quot;yahoo.com&quot;, 80);

  一旦你成功地创建了一个 socket 类的实例,你就可以用它去发送与接收字节流了。要发送字节流,你需要呼叫 socket 类的 getoutputstream 方法来得到一个 java.io.outputsteam 对象。要发送文本到远程的程序,你通常需要从返回的 outputstream 创建一个 java.io.printwriter 对象。要从连接的另一端接收字节流,你需要呼叫 socket 类的 getinputstream 方法,它返回一个 java.io.inputstream 对象。

  以下代码创建一个可以与本地 http 服务器通信的 socket (127.0.0.1 表示一个本地的主机),发送一个 http 请求,并接收从服务器的响应。它还创建一个 stringbuffer 对象来接受响应,并打印到控制台。
socket socket    = new socket(&quot;127.0.0.1&quot;, &quot;8080&quot;);
outputstream os   = socket.getoutputstream();
boolean autoflush = true;
printwriter out   = new printwriter( socket.getoutputstream(), autoflush );
bufferedreader in = new bufferedreader(
    new inputstreamreader( socket.getinputstream() ));

// send an http request to the web server
out.println(&quot;get /index.jsp http/1.1&quot;);
out.println(&quot;host: localhost:8080&quot;);
out.println(&quot;connection: close&quot;);
out.println();

// read the response
boolean loop    = true;
stringbuffer sb = new stringbuffer(8096);

while (loop) {
    if ( in.ready() ) {
        int i=0;
        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 服务器得到正确的响应,你必须要发送用 http 协议编译了的 http 请求。如果你看了上面的 http 部分,你应该能够理解上面代码中的 http 请求。

  
matrix开源技术经onjava授权翻译并发布.
如果你对此文章有任何看法或建议,请到matrix论坛发表您的意见.
注明: 如果对matrix的翻译文章系列感兴趣,请点击oreilly和javaworld文章翻译计划查看详细情况
您也可以点击-fajaven查看翻译作者的详细信息.


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons