HTTP响应的第一行包括服务器使用的HTTP协议的版本、状态代码,以及对状态代码的描述,这三项内容之间以空格分割。在本例中,使用HTTP1.1协议,状态代码为200,该状态代码表示服务器已经成功地处理了客户端发出的请求:
HTTP/1.1 200 OK
状态代码是一个3位整数,以1、2、3、4或5开头:
l 1xx:信息提示,表示临时的响应。
l 2xx:响应成功,表明服务器成功地接收了客户端请求。
l 3xx:重定向。
l 4xx:客户端错误,表明客户端可能有问题。
l 5xx:服务器错误,表明服务器由于遇到某种错误而不能响应客户请求。
以下是一些常见的状态代码:
l 200:响应成功。
l 400:错误的请求。客户发送的HTTP请求不正确。
l 404:文件不存在。在服务器上没有客户要求访问的文档。
l 405:服务器不支持客户的请求方式。
l 500:服务器内部错误。
响应头也和请求头一样包含许多有用的信息,例如服务器类型、正文类型和正文长度等:
Server: nio/1.1 //服务器类型
Content-type: text/html; charset=GBK //正文类型
Content-length: 102 //正文长度
响应正文就是服务器返回的具体文档,最常见的是HTML网页:
<html>
<head>
<title>helloapp</title>
</head>
<body >
<h1>hello</h1>
</body>
</html>
HTTP请求头与请求正文之间必须用空行分割,同样,HTTP响应头与响应正文之间也必须用空行分隔。
3.测试HTTP请求
当用户在浏览器中输入一个URL,浏览器就会生成一个HTTP请求,建立与远程HTTP服务器的连结,然后把HTTP请求发送给远程HTTP服务器,HTTP服务器再返回相应的网页,浏览器最后把这个网页显示出来。当浏览器与服务器之间的数据交换完毕,就会断开连结。如果用户希望访问新的网页,浏览器必须再次建立与服务器的连结。
例程1(SimpleHttpServer)创建了一个非常简单的HTTP服务器,它接收客户程序的HTTP请求,把它打印到控制台。然后对HTTP请求做简单的解析,如果客户程序请求访问login.htm,就返回该网页,否则一律返回hello.htm网页。login.htm和hello.htm文件位于classpath下的root目录下。
SimpleHttpServer监听80端口,按照阻塞模式工作,采用线程池来处理每个客户请求。
//例程1 SimpleHttpServer.java(阻塞模式)
//此处省略import语句
public class SimpleHttpServer {
private int port=80;
private ServerSocketChannel serverSocketChannel = null;
private ExecutorService executorService;
private static final int POOL_MULTIPLE = 4;
public SimpleHttpServer() throws IOException {
executorService= Executors.newFixedThreadPool(
|