浏览 1633 次
锁定老帖子 主题:小型WEB服务器程序解析1
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2008-02-29
设计分析:简易WebServer由三个类组成,HttpServer,Request,Response 启动主类是HttpServer class.它创建一个HttpServer实例来调用它的await()方法,启动类是一个线程类,继承Tread,这个方法在一个指定的端口接受进入的HTTP请求,处理请求后 发送Response到客户端,await()一直在等待状态,知道它接受一个退出的命令。这个程序只能从指定的目录发送静态的内容给客户端,简单文件 比如 html image txt文件,且不支持headers参数处理(像dates,cookies)。 分析类HttpServer:它是一个WEB服务器,它为客户端提供public static void finalWEB_ROOT指定下的静态资源,WEB_ROOT的初始化,public static void finalWEB_ROOT=System.getProperty("user.dir") + File.separator + "webroot"; HttpServer写成一个线程 继承Thread,设定一个停止命令 和端口,在run()里面定义InputStream OutputStream ,生成Request对象,调用Request里面的ParseContent(),解析Request上来的字符串,然后生成应答对象,传入输出流(ous)和Request(客户端的请求路径)。 分析类Request:与客户端连结的socket得到的InputStream对象创建,通过对这个InputStream对象的read调用可以得到客户端请求的原始数据,定义两个方法Parse()和parseUrl()来解析Request的原始数据,构造方法中传入这个input.定义私有的变量,private InoutSteam input,private String url,Request 类中的三个方法,一个是public void Parse()(解析请求的的内容) public string parseUrl(String queryString). 在Parse()方法中定义一个StringBuffer sb=new StringBuffer(); 程序实现如下: StringBuffer sb=new StringBuffer(); Int chh= -1; While((chh=input.Read())!=-1){ request.Append((char)chh); If(request.toString.endWith("\r\n")) { Break; } } 接下来将得到的字符串进行转码 以免出现乱码: String requeStr=request.toString(); // 对读取到的数据进行重新编码 以免出现乱码 requeStr = java.net.URLDecoder.decode(requeStr, "GBK"); Url=praseURL(requeStr); System.out.println(requeStr); 接下来把独到的数据装载到一个数组中间 然后打印出来,那么接下来定义一个数组 Byte[] recivedData=new byte[input.available()]; 读取出来 Input.read(recivedData); String result=new String(recivedData); System.out.println(result); 接下来来解析URL: /** * 从请求的内容中解析出路径 * * @param requestString */ private String parseURL(String requestString) { int index1, index2; index1 = requestString.indexOf(' '); if (index1 != -1) { index2 = requestString.indexOf(' ', index1 + 1); if (index2 > index1) return requestString.substring(index1 + 1, index2); } return null; } 还有一个方法是GET到一个URL,返回一个url那么可以这样来定义: Public String getUrl(){ Return url; 分析类response:它是一个应答对象,通过一个OutputStream 参数组成。 私有化两个变量 一个是是客户端的请求参数 一个是一个输出流。这样来定义, Private Request request; Private OutputStream output; private static final int BUFFER_SIZE = 1024; 在构造器中传入这两个参数: Public void Response(String request,Stringoutput){ This.request=rquest; This.output=output; } 接下来分析这个类中的几个方法 为什么是这几个方法: 首先有一个可以给客户端发送静态资源的方法:public void sendStaticResource(); 把客户端请求的文件名和目录写到输出流中:public void findFile(String url;outputStream output) throws IOException 将客户上传来的查询字符串解析成名值对 放入到一个map中间:private void parseParameter(String querString); 最后一个方法 就是替换字符串中的指定字符:private static String replace(String sorceStr,String fromStr,String toStr)三个变量分别表示源字符串,需要被替换的字符串 替换厚的目标字符串。 接下来就分析没一个方法的实现: 1:public void sendStaticResource(){ Try{ //这里的request 是客户端的请求参数 在request类中已经定义 findFile(request.getUrl,output) } Catch(Exceoption e) { System.out.println("get file error"+e); } Finally{ Try{ Output.close(); } Catch(Exception e) {} } } 这样就能把客户端的请求以静态的文本发送给客户端了 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |