java web服务器是如何工作的,Web服务器也是超文本传输协议服务器,因为它使用HTTP来跟客户端进行通信的,这通常是个web浏览器。一个基于java的web服务器使用两个重要的类:java.net.Socket 和java.net.ServerSocket,并通过 HTTP 消息进行通信。


[b] 超文本传输协议(HTTP) [/b]


HTTP 是一种协议,允许 web 服务器和浏览器通过互联网进行来发送和接受数据。它是一种请求和响应协议。客户端请求一个文件而服务器响应请求。HTTP使用可靠的TCP连接--TCP默认使用80端口。


注意:


在HTTP中,始终都是客户端通过建立连接和发送一个HTTP请求从而开启一个事务。web服务器不需要联系客户端或者对客户端做一个回调连接。无论是客户端或者服务器都可以提前终止连接。举例来说,当你正在使用一个web浏览器的时候,可以通过点击浏览器上的停止按钮来停止一个文件的下载进程,从而有效的关闭与web服务器的HTTP连接。



[b]HTTP 请求[/b]


一个HTTP请求包括三个组成部分:


 方法—统一资源标识符(URI)—协议/版本


 请求的头部


 主体内容


请求的头部包含了关于客户端环境和请求的主体内容的有用信息。例如它可能包括浏览器设置的语言,主体内容的长度等等。每个头部通过一个回车换行符(CRLF)来分隔的。


对于HTTP请求格式来说,头部和主体内容之间有一个回车换行符(CRLF)是相当重要的。 CRLF告诉HTTP服务器主体内容是在什么地方开始的。在一些互联网编程书籍中, CRLF还被认为是HTTP请求的第四部分。


[b]补充[/b]


http请求之请求行 (转)


http阐述:


http请求由三部分组成,分别是:请求行、消息报头、请求正文


但由于消息报头和请求正文之间有一个"CRLF"


所以我自己定义为四部分


即:


请求行


消息报头


CRLF


正文




请求行阐述:




1、请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-


URI HTTP-Version CRLF


其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;


CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。




请求方法(所有方法全为大写)有多种,各个方法的解释如下:


GET 请求获取Request-URI所标识的资源


POST 在Request-URI所标识的资源后附加新的数据


HEAD 请求获取由Request-URI所标识的资源的响应消息报头


PUT 请求服务器存储一个资源,并用Request-URI作为其标识


DELETE 请求服务器删除Request-URI所标识的资源


TRACE 请求服务器回送收到的请求信息,主要用于测试或诊断


CONNECT 保留将来使用


OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求


应用举例:


GET方法:在浏览器的地址栏中输入网址的方式访问网页时,浏览器采用GET方法向服务器获取资源,


eg:GET /form.html HTTP/1.1 (CRLF)



POST方法要求被请求服务器接受附在请求后面的数据,常用于提交表单。


eg:POST /reg.jsp HTTP/ (CRLF)


Accept:image/gif,image/x-xbit,... (CRLF)


...


HOST:www.guet.edu.cn (CRLF)


Content-Length:22 (CRLF)


Connection:Keep-Alive (CRLF)


Cache-Control:no-cache (CRLF)


(CRLF) //该CRLF表示消息报头已经结束,在此之前为消息报头


user=jeffrey&pwd=1234 //此行以下为提交的数据



HEAD方法与GET方法几乎是一样的,对于HEAD请求的回应部分来说,它的HTTP头部中包含的信息与通过


GET请求所得到的信息是相同的。利用这个方法,不必传输整个资源内容,就可以得到Request-URI所标识的资


源的信息。该方法常用于测试超链接的有效性,是否可以访问,以及最近是否更新。




[b]HTTP 响应 [/b]


类似于HTTP请求,一个HTTP响应也包括三个组成部分:


 方法—统一资源标识符(URI)—协议/版本


 响应的头部


 主体内容


响应头部的第一行类似于请求头部的第一行。第一行告诉你该协议使用 HTTP 1.1,请求成功(200=成功),表示一切都运行良好。


响应头部和请求头部类似,也包括很多有用的信息。响应的主体内容是响应本身的 HTML内容。头部和主体内容通过CRLF分隔开来。



[b]Socket 类 [/b]


套接字是网络连接的一个端点。套接字使得一个应用可以从网络中读取和写入数据。放在两个不同计算机上的两个应用可以通过连接发送和接受字节流。为了从你的应用发送一条信息到另一个应用,你需要知道另一个应用的 IP 地址和套接字端口。在 Java 里边,套接字指的是java.net.Socket类。


一旦你成功创建了一个 Socket 类的实例,你可以使用它来发送和接受字节流。要发送字节流,你首先必须调用Socket类的getOutputStream方法来获取一个java.io.OutputStream对象。要发送文本到一个远程应用,你经常要从返回的 OutputStream 对象中构造一个


java.io.PrintWriter 对象。要从连接的另一端接受字节流,你可以调用 Socket 类的


getInputStream方法用来返回一个java.io.InputStream对象。



[b]ServerSocket 类 [/b]


Socket 类代表一个客户端套接字,即任何时候你想连接到一个远程服务器应用的时候你构造的套接字,现在,假如你想实施一个服务器应用,例如一个 HTTP服务器或者 FTP 服务器,你需要一种不同的做法。这是因为你的服务器必须随时待命,因为它不知道一个客户端应用什么时候会尝试去连接它。为了让你的应用能随时待命,你需要使用java.net.ServerSocket类。这是服务器套接字的实现。


ServerSocket和Socket不同,服务器套接字的角色是等待来自客户端的连接请求。一旦服务器套接字获得一个连接请求,它创建一个Socket实例来与客户端进行通信。


要创建一个服务器套接字,你需要使用ServerSocket 类提供的四个构造方法中的一个。你需要指定 IP地址和服务器套接字将要进行监听的端口号。通常,IP 地址将会是 127.0.0.1,也就是说,服务器套接字将会监听本地机器。服务器套接字正在监听的 IP地址被称为是绑定地址。服务器套接字的另一个重要的属性是backlog,这是服务器套接字开始拒绝传入的请求之前,传入的连接请求的最大队列长度。


[b]一个简单的应用程序思路[/b]


由3个类组成


HttpServer


Request


Response


这个应用程序的入口点(静态 main 方法)可以在 HttpServer 类里边找到。main 方法创建了一个 HttpServer 的实例并调用了它的 await 方法。await 方法,顾名思义就是在一个指定的端口上等待HTTP请求,处理它们并发送响应返回客户端。它一直等待直至接收到shutdown命令。


应用程序不能做什么,除了发送静态资源,例如放在一个特定目录的HTML文件和图像文件。它也在控制台上显示传入的 HTTP 请求的字节流。不过,它不给浏览器发送任何的头部例如日期或者cookies。