Java网络编程从入门到精通 实现HTTP模拟器 — IT技术

王朝站长·作者佚名  2009-06-17  
宽屏版  字体: |||超大  

在讨论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对象,通过这个对象,可以直接从控制台读取字符串,而不是一个个地字节。在讨论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对象,通过这个对象,可以直接从控制台读取字符串,而不是一个个地字节。

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
© 2005- 王朝网络 版权所有