(探索)用Java Socket模拟Web服务器的功能II

目录结构截图:

(探索)用Java Socket模拟Web服务器的功能II_第1张图片

 

Index.html

(探索)用Java Socket模拟Web服务器的功能II_第2张图片

 

FileNotFound.html

(探索)用Java Socket模拟Web服务器的功能II_第3张图片

 

相信了吧,没骗人吧!

 

 

HTTPInputStream.java

package org.bruce.httpserver.version1; import java.io.FilterInputStream; import java.io.IOException; import java.io.InputStream; /* * /r 是回车,return * /n 是换行,newline * 我们在平时使用电脑时,已经习惯了回车和换行一次搞定,敲一个回车键,即是回车,又是换行, * 但在早期的打字机上,要另起一行打字需要两个步骤,首先要发送命令"/r”将打字头复位,即回车, * 然后再发送命令"/n”让打字机走纸移到下一行,所以这个历史遗留问题导致了如今我们 * 在DOS-Windows的系统里需要区分 "/r/n” 和 “/n” ,但在 Unix 中只有 "/n” 。 * 用UltraEdit打开文本查看,会看到换行处显示的是 0x0D0A , 0x0D 即 "/r” ,0x0A 即 "/n”。 * 有时候在文本文件中出现 ■ 这样的符号,是因为没有 "/r/n" 连用,导致不能正确回车换行。 * 在C中读取文本时,"/r/n” 已自动转成 "/n” 。 */ public class HTTPInputStream extends FilterInputStream { public HTTPInputStream(InputStream in) { super(in); } //得到所有的请求 public HTTPRequest getRequest() throws IOException { HTTPRequest request = new HTTPRequest(); String line; while(true) { line = readLine(); //将请求填入容器 if(line.length()>0) { request.addLine(line); } else { break; } } return request; } //读一行 public String readLine() throws IOException { StringBuffer result = new StringBuffer(); boolean finished = false; //回车符 boolean cr = false; do { int ch = -1; //这个read()方法是父类中的方法! ch = this.read(); //ch == -1 应该是表示已经读到末尾 if(ch == -1) { return result.toString(); } result.append((char)ch); //去掉最后的“/n”两个字符 //ch == 10 表示 换行符 if((cr == true) && (ch == 10)) { result.setLength(result.length()-2); return result.toString(); } //读到回车符 "/r"( ch == 13 表示回车符 ),设置标识 if(ch == 13) { cr = true; } else { cr = false; } } while(!finished); //下面这句代码根本就不会被执行,只是为了不报错才写的! return result.toString(); } }

 

HTTPRequest.java

package org.bruce.httpserver.version1; import java.util.Vector; //典型的回应状态消息如下所示: //200 OK: 请求回应成功 //301 MovedPermanently: 被请求的对象被移动 //400 Bad Request: 请求不能被解析 //404 Not Found: 没有发现被请求的文档。 //505 HTTP Version Not Suppoerted: 不支持的HTTP版本 public class HTTPRequest { Vector<Object> lines = new Vector<Object>(); public HTTPRequest() {} //这个方法是给别人用的 public void addLine(String line) { lines.addElement(line); } //判断是否为 GET 请求 public boolean isGetRequest() { if(lines.size() > 0) { String firstLine = (String)lines.elementAt(0); if(firstLine.length() > 0) { //substring(0,3)表示从0开始取,取3位字符 if(firstLine.substring(0, 3).equalsIgnoreCase("GET")) { return true; } } } return false; } //从请求中解析到文件名 public String getFileName() { if(lines.size() > 0) { //得到vector中第一个元素 String firstLine = (String)lines.elementAt(0); //得到文件名 //根据http消息格式 String fileName = firstLine.substring(firstLine.indexOf(" ") +1); int n = fileName.indexOf(" "); //URL在两个空格之间 //如果没有找到这个字符的话就返回 -1 if(n != -1) { fileName = fileName.substring(0, n); System.out.println(fileName); } //去掉第一个“/” try { if(fileName.charAt(0) == '/') { fileName = fileName.substring(1); System.out.println(fileName); } }catch(Exception e ){ e.printStackTrace(); } //默认首页(这里还搞得不是很清楚!) //类似于“http://localhost:80”的情况 if(fileName.equals("")) { fileName = "WebRoot/index.html"; } //类似于“http://localhost:80//”的情况 if(fileName.charAt(fileName.length()-1)=='/') { fileName += "WebRoot/index.html"; } return fileName; } else { return ""; } } //显示请求信息 public void log() { System.out.println("Received the following request:"); for(int i = 0; i < lines.size(); ++ i) { System.out.println((String)lines.elementAt(i)); } } }

 

再附上一份浏览器相关的代码:

Browser.java

package org.bruce.httpserver.version1; import java.io.BufferedReader; import java.io.InputStreamReader; import java.net.HttpURLConnection; import java.net.URL; //现在读者对HTTP协议的过程应该已经有所了解,下面让我们来完成一个简单的基于文本的HTTP客户端 public class Browser { //网址 URL String urlString; public static void main(String[] args) throws Exception { if(args.length != 1) { System.out.println("Usage: Java Browser url"); System.exit(1); } Browser browser = new Browser(args[0]); browser.run(); } public Browser(String urlString) { this.urlString = urlString; } public void run() throws Exception { //生成一个URL对象 URL url = new URL(urlString); //得到输入流 HttpURLConnection urlc = (HttpURLConnection)url.openConnection(); //打印头信息 System.out.println("THE HEADERS"); System.out.println("-----------"); for(int i = 1; ; ++i) { String key; String value; if((key = urlc.getHeaderFieldKey(i)) == null) break; if((value = urlc.getHeaderField(i)) == null) break; System.out.println(key); System.out.println("is: " + value); } //得到输入流 BufferedReader reader = new BufferedReader(new InputStreamReader(urlc.getInputStream())); String line; System.out.println("----CONTENT-------"); while((line = reader.readLine()) != null) { System.out.println(line); } } }

你可能感兴趣的:(java,exception,socket,String,web服务,browser)