码迷,mamicode.com
首页 > 编程语言 > 详细

java模拟http服务器

时间:2015-04-07 07:18:51      阅读:222      评论:0      收藏:0      [点我收藏+]

标签:http服务器java实现

最近用java简单实现了http服务器。主要是使用socket在端口监听浏览器的http请求,根据请求信息在服务器端进行路由(读取html页面),然后封装成http格式的响应返回到浏览器。代码如下:

技术分享

项目大概这样。

HttpServer:

package server;


import java.io.*;

import java.net.*;


import router.SocketHandler;


/**

 * http服务器启动类

 * @author Administrator

 *

 */

public class HttpServer {

    static ServerSocket server = null ;

    static Socket socket ;

    static int PORT = 8888 ;

    static String IP = "127.0.0.1";

    

    public static void waiting(){

try {

   server = new ServerSocket(PORT , 1,  InetAddress.getByName(IP));

   System.out.println("server waiting on " + PORT + " .....");

   while(true){

socket = server.accept();

SocketHandler.handle(socket);

   }

}catch (IOException e) {

   e.printStackTrace();

}

    }


    public static void main(String[] args) {

waiting();

    }

}



socketHandler类:处理链接的socket。

package router;


import java.io.*;

import java.net.*;


/**

 * 解析socket

 * @author Administrator

 *

 */

public class SocketHandler {

    

    static Socket socket ;

    static BufferedReader reader = null;

    static PrintWriter out = null ;

    static String requestUri = null ;

    

    public static void handle(Socket socket){

SocketHandler.socket = socket ;

resoveRequest();

sendResponse();

close();

    }

    

    static void close(){

if( out != null)

   out.close();

try {

   if( reader != null)

reader.close();

   if( socket != null)

socket.close();

} catch (IOException e) {

   e.printStackTrace();

}

    }

    

    /**

     * 解析request

     */

    public static void resoveRequest(){

try {

   reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));

   String item = reader.readLine() ;

   

   if( item != null ){

requestUri = item.split(" ")[1];

   }

   

} catch (IOException e) {

  e.printStackTrace();

}

    }

    

    /**

     * 返回response数据

     * @param out

     */

    public static void sendResponse(){

String html = Router.getPageContent(requestUri);

try {

   StringBuffer sb = new StringBuffer();

   out = new PrintWriter(socket.getOutputStream());

   /**

    * response header

    *///

            //封装http响应

   sb.append("HTTP/1.1 200\r\n");

   sb.append("Server: EvergreenServer\r\n");

   sb.append("Date: Mon, 3 April 2015 13:13:33 GMT\r\n");

   sb.append("Content-type:text/html;\r\n");

   sb.append("Content-Length: "  + html.length() + "\r\n");

   sb.append("\r\n");

   /**

    * content

    */

   sb.append(html);

   out.println(sb.toString());

   out.flush();

   out.close();

} catch (IOException e) {

   e.printStackTrace();

}

    }


}


Router类:(主要实现对请求url的解析。将html内容返回给响应头。)

package router;


import java.io.*;


/**

 * 路由类

 * @author Administrator

 *

 */

public class Router {

    

    public static String getPageContent(String uri){

File file = new File("web-root" + (uri.lastIndexOf("?") != -1 ? (uri.substring(0, uri.lastIndexOf("?"))) : uri ));

StringBuffer sb = new StringBuffer();

if( file.exists() == false){

   sb.append("<center>404  <h4 style=‘color:red;‘>Page Not Found</h4></center>");

}else{

   BufferedReader bur = null ;

   try {

bur = new BufferedReader(new InputStreamReader(new FileInputStream(file)));

String str = null;

while( (str = bur.readLine()) != null)

   sb.append(str);

   } catch (Exception e) {

   }finally{

if( bur != null)

   try {

bur.close();

   } catch (IOException e) {

   }

   }

}

return  sb.toString() ;

    }


    public static void main(String[] args) {

    }

}

访问http://localhost:8888/blog/index.html


技术分享

java模拟http服务器

标签:http服务器java实现

原文地址:http://7385573.blog.51cto.com/7375573/1629397

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!