专题推荐:网络编程-基础到进阶教程
在讨论HTTP协议的具体请求和响应头字段之前,让我们先来利用以前所学的知识来实现一个HTTP模拟器。所谓HTTP模拟器就是可以在用户输入HTTP的请求消息后,由这个模拟器将HTTP请求发送给相应的服务器,再接收服务器的响应消息。这个HTTP模拟器有几下特点:
1. 可以手工输入HTTP请求,并向服务器发送。
2. 接收服务器的响应消息。
3. 消息头和实体内容分段显示,也就是说,并不是象Telnet等客户端一样将HTTP响
应消息全部显示,而是先显示消息头,然后由用户决定是否显示实体内容。
4. 集中发送请求。这个HTTP模拟器和Telnet不同的是,并不是一开始就连接服务器,
而是将域名、端口以及HTTP请求消息都输完后,才连接服务器,并将这些请求发送给服务器。这样做的可以预防服务器提前关闭网络连接的现象。
5. 可以循环做上述的操作。
从以上的描述看,要实现这个HTTP模拟器需要以下五步:
1. 建立一个大循环,在循环内部是一个请求/响应对。这样就可以向服务器发送多次请求/响应以了。下面的四步都是被包括在循环内部的。
2. 从控制台读取域名和端口,这个功能可以由readHostAndPort(……)来完成。
3. 从控制台读取HTTP请求消息,这个功能由readHttpRequest(……)来完成。
4. 向服务器发送HTTP请求消息,这个功能由sendHttpRequest()来完成。
5. 读取服务器回送的HTTP响应消息,这个功能由readHttpResponse(……)来完成。
下面我们就来逐步实现这五步:
一、建立一个大循环
在建立这个循环之前,先建立一个中叫HttpSimulator的类,并在这个类中定义一个run方法用来运行这个程序。实现代码如下:
001
package
http;
002
003
import
java.net.
*
;
004
import
java.io.
*
;
005
006
public
class
HttpSimulator
007
{
008
private
Socket socket;
009
private
int
port
=
80
;
010
private
String host
=
"
localhost
"
;
011
private
String request
=
""
;
//
HTTP请求消息
012
private
boolean
isPost, isHead;
013
014
public
void
run()
throws
Exception
015
{
016
BufferedReader reader
=
new
BufferedReader(
new
InputStreamReader(
017
System.in));
018
while
(
true
)
//
开始大循环
019
{
020
try
021
{
022
if
(
!
readHostAndPort(reader))
023
break
;
024
readHttpRequest(reader);
025
sendHttpRequest();
026
readHttpResponse(reader);
027
}
028
catch
(Exception e)
029
{
030
System.out.println(
"
err:
"
+
e.getMessage());
031
}
032
}
033
}
034
public
static
void
main(String[] args)
throws
Exception
035
{
036
new
HttpSimulator().run();
037
}
038
}
从上面的代码可以看出,第022、024、025和026分别调用了上述的四个方法。这些方法的具体实现将在后面讨论。上面的代码除了调用这四个核心方法外,还做了一些准备工作。在008至012行定义了一些以后要用到的变量。在016和017行使用控制台的输入流建立了BufferedReader对象,通过这个对象,可以直接从控制台读取字符串,而不是一个个地字节。