国内前十网站建设公司网站建设需要达到什么样的效果
国内前十网站建设公司,网站建设需要达到什么样的效果,2014个人网站备案,手机wordpress后台前面我们讨论了HTTP协议的基本结构和Socket编程的基本原理#xff0c;本文我们来整个大活#xff1a;自己实现一个简单的浏览器。
目录
1.主线程循环体
2.readHostAndPort()方法的实现
3.readHttpRequest()方法的实现
4.sendHttpRequest()方法的实现
5.readHttpRespons…前面我们讨论了HTTP协议的基本结构和Socket编程的基本原理本文我们来整个大活自己实现一个简单的浏览器。
目录
1.主线程循环体
2.readHostAndPort()方法的实现
3.readHttpRequest()方法的实现
4.sendHttpRequest()方法的实现
5.readHttpResponse(...)方法的实现 在讨论HTTP协议的具体请求和响应头字段之前让我们先来利用以前所学的知识来实现一个HTTP模拟器。所谓HTTP模拟器就是可以在用户输入HTTP的请求消息后由这个模拟器将HTTP请求发送给相应的服务器再接收服务器的响应消息。这个HTTP模拟器有几下特点 1. 可以手工输入HTTP请求并向服务器发送。 2. 接收服务器的响应消息。 3. 消息头和实体内容分段显示也就是说并不是象Telnet等客户端一样将HTTP响 应消息全部显示而是先显示消息头然后由用户决定是否显示实体内容。 4. 集中发送请求。这个HTTP模拟器和Telnet不同的是并不是一开始就连接服务器 而是将域名、端口以及HTTP请求消息都输完后才连接服务器并将这些请求发送给服务器。这样做的可以预防服务器提前关闭网络连接的现象。 5. 可以循环做上述的操作。 从以上的描述看要实现这个HTTP模拟器需要以下五步
主线程里建立一个死循环的while在循环内部是一个请求/响应对。这样就可以向服务器发送多次请求/响应以了。下面的四步都是被包括在循环内部的。从控制台读取域名和端口这个功能可以由readHostAndPort(...)来完成。从控制台读取HTTP请求消息这个功能由readHttpRequest(...)来完成。向服务器发送HTTP请求消息这个功能由sendHttpRequest()来完成。读取服务器回送的HTTP响应消息这个功能由readHttpResponse(...)来完成。
下面我们就来逐步实现这五步
1.主线程循环体
在建立这个循环之前先建立一个中叫HttpSimulator的类并在这个类中定义一个run方法用来运行这个程序。实现代码如下
public class HttpSimulator {private Socket socket;private int port 80;private String host localhost;private String request ; // HTTP请求消息 012private boolean isPost, isHead;public void run() throws Exception {BufferedReader reader new BufferedReader(new InputStreamReader(System.in));while (true) // 开始大循环{try {if (!readHostAndPort(reader)) break;readHttpRequest(reader);sendHttpRequest();readHttpResponse(reader);} catch (Exception e) {System.out.println(err: e.getMessage());}}}public static void main(String[] args) throws Exception {new HttpSimulator().run();}
从上面的代码可以看出我们分别调用了上述的四个方法。这些方法的具体实现将在后面讨论。上面的代码除了调用这四个核心方法外还做了一些准备工作。在008至012行定义了一些以后要用到的变量。在016和017行使用控制台的输入流建立了BufferedReader对象通过这个对象可以直接从控制台读取字符串而不是一个个地字节。
2.readHostAndPort()方法的实现 这个方法的主要功能是从控制台读取域名和端口。域名和端口通过:隔开:和域名以及端口之间不能有空格。当从控制台读取一个q时这个函数返回false表示程序可以退出了否则返回true表示输入的域名和端口是正确的。这个方法的实现代码如下 private boolean readHostAndPort(BufferedReader consoleReader) throws Exception {System.out.print(host:port);String[] ss null;String s consoleReader.readLine();if (s.equals(q)) return false;else {ss s.split([:]);if (!ss[0].equals()) host ss[0];if (ss.length 1) port Integer.parseInt(ss[1]);System.out.println(host : String.valueOf(port));return true;}}
上面的代码我们做一个分析
这个方法有一个BufferedReader类型的参数这个参数的值就是在HttpSimulator.java中的第016和017行根据控制台输入流建立的BufferedReader对象。这输出HTTP模拟器的控制符就象Windows的控制台的C:一样。consoleReader.readLine()从控制台读取一行字符串。ss s.split([:]) 通过字符串的split方法和响应的正则表示式([:])将域名和端口分开。域名的默认值是localhost端口的默认值是80。
3.readHttpRequest()方法的实现 这个方法的主要功能是从控制台读取HTTP请求消息如果输入一个空行表示请求消息头已经输完如果使用的是POST方法还要输入POST请求的实体内容。这个方法的实现代码如下 private void readHttpRequest(BufferedReader consoleReader) throws Exception {System.out.println(请输入HTTP请求:);String s consoleReader.readLine();request s \r\n;boolean isPost s.substring(0, 4).equals(POST);boolean isHead s.substring(0, 4).equals(HEAD);while (!(s consoleReader.readLine()).equals()) {request request s \r\n;}request request \r\n;if (isPost) {System.out.println(请输入POST方法的内容:);s consoleReader.readLine();request request s;}}
上面的代码我们简单解释一下
consoleReader.readLine() 读入HTTP请求消息的第一行。isPost 和isHead 用于确定所输入的请求方法是不是POST和HEAD。之后的代码读入HTTP请求消息的其余行。if (isPost) 代码段的功能是如果HTTP请求使用的是POST方法要求用户继续输入HTTP请求的实体内容。
4.sendHttpRequest()方法的实现
这个方法的功能是将request变量中的HTTP请求消息发送到服务器。下面是这个方法的实现代码 private void sendHttpRequest() throws Exception {socket new Socket();socket.setSoTimeout(10 * 1000); //设置读取数据超时为10秒。System.out.println(正在连接服务器);socket.connect(new InetSocketAddress(host, port), 10 * 1000); //超时时间System.out.println(服务器连接成功);OutputStream out socket.getOutputStream();OutputStreamWriter writer new OutputStreamWriter(out);writer.write(request);writer.flush();}
5.readHttpResponse(...)方法的实现
这个方法的主要功能是从服务器读取返回的响应消息。首先读取了响应消息头然后要求用户输入Y或N以确定是否显示响应消息的实体内容。这个程序之所以这样做主要有两个原因 (1) 为了研究HTTP协议。 (2) 由于本程序是以字符串形式显示响应消息的因此如果用户请求了一个二进制Web资源如一个rar文件那么实体内容将会显示乱码。所以在显示完响应消息头后由用户决定是否显示实体内容。 这个方法的实现代码如下 private void readHttpResponse(BufferedReader consoleReader) {String s ;try {InputStream in socket.getInputStream();InputStreamReader inReader new InputStreamReader(in);BufferedReader socketReader new BufferedReader(inReader);System.out.println(---------HTTP头---------);boolean b true; // true: 未读取消息头 false: 已经读取消息头 011while ((s socketReader.readLine()) ! null) {if (s.equals() b true !isHead) {System.out.println(------------------------);b false;System.out.print(是否显示HTTP的内容(Y/N):);String choice consoleReader.readLine();if (choice.equals(Y) || choice.equals(y)) {System.out.println(---------HTTP内容---------);continue;} else break;} else System.out.println(s);}} catch (Exception e) {System.out.println(err: e.getMessage());} finally {try {socket.close();} catch (Exception e) {}} System.out.println(------------------------);}
在上面的代码中013行是最值得注意的。其中s.equals()表示读入一个空行表明消息头已经结束由于在实体内容中也可以存在空行因此b true来标记消息头是否已经被读过当读完消息头后将b设为false如果以后再遇到空行就不会当成消息头来处理了。当HTTP请求使用HEAD方法时服务器只返回响应消息头;因此使用!isHead来保证使用HEAD发送请求时不显示响应消息的内容实体。 现在我们已经实现了这个HTTP模拟器下面让我们来运行并测试它。
我们将上面的代码执行起来然后会有个输入的提示 我们输入www.csdn.net
然后继续分行输入如下的HTTP请求消息 GET / HTTP/1.1 Host: www.csdn.net 之后根据提示输入Y运行的结果如下所示 ------------------------ 是否显示HTTP的内容(Y/N):Y ---------HTTP内容--------- html headtitle400 Bad Request/title/head body centerh1400 Bad Request/h1/center hrcenterWAF/center /body /html 到此我们就实现了一个简单的HTTP浏览器了。
参考
本文参考了李宁老师(蒙娜丽宁)的文章和介绍
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/87499.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!