模拟tomcat!!!

直接上代码:

package com.test.monkey;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
/**
 * 设计一个服务器,支持浏览器
 * socket
 * 返回相应(IO流)
 * @param args
 * @throws IOException 
 */
public class tomMonkey {
 /**
  * 默认端口
  */
 private static int PORT=8080;
 
 /**
  * 程序启动方法
  * @param args
  * @throws IOException
  */
 public static void main(String[] args) throws IOException {
  System.out.println(args.length);
  //可以动态设置服务器的端口
  int p = (args.length>0)?Integer.parseInt(args[0]):PORT;
  new tomMonkey().start(p);
 }
 
 /**
  * 启动服务
  * 创建socket服务器
  * @throws IOException 
  */
 public void start(int port) throws IOException{
  ServerSocket ss = new ServerSocket(port); //监听端口
  System.out.println("-----监听"+port+"端口-----");
  while(true){
   Socket socket = ss.accept();
   System.out.println("-----------客户端请求-----------");
   //new Thread(new HandleRequestThread(socket));
   //创建线程池
   ExecutorService pool = Executors.newFixedThreadPool(100);  //设置线程池最多并发访问量100
   //将任务交给线程池处理
   pool.submit(new HandleRequestThread(socket));
  }
 }
}
package com.test.monkey;
import java.beans.beancontext.BeanContext;
import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;
import java.nio.Buffer;
import javax.management.loading.PrivateClassLoader;
public class HandleRequestThread implements Runnable{

 private InputStream in = null;//输入流
 private PrintStream out = null;//输出流
 //对应的资源路径
 public static final String WEB_ROOT = "D:"+File.separator+"MyWeb"+File.separator;
 
 /**
  * 通过构造器获取socket
  * 并通过socket获取对客户端的输入流和输出流
  * @param socket
  */
 public HandleRequestThread(Socket socket){
  
  try {
   in = socket.getInputStream();
   out = new PrintStream(socket.getOutputStream()); //输出流
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  
 }
 /**
  * 解析请求头,获得客户端请求的资源名称
  * @param in 客户端输入流
  * @return
  * @throws IOException 
  */
 public String parseReauestHead(InputStream in ) throws IOException{
  //客户端发送的请求会把一些请求数据包含在请求头中.....
  BufferedReader bReader = new BufferedReader(new InputStreamReader(in));
  //读取请求头中的第一行包含请求的方式,请求的资源名称,请求的协议版本...
  String headConnent = bReader.readLine();
  //数据使用空格分隔的
  System.out.println(headConnent);
  //获取部分数据
  String[] heads = headConnent.split(" "); 
  System.out.println(heads[1]);
   return heads[1];
   
 }
 
 public void GetFile(String fileName) throws IOException{
  File file = new File(WEB_ROOT+fileName);
  if(!file.exists()){
   System.out.println("资源不存在");
   return;
  }
  System.out.println(file.toString());
        try {
   BufferedInputStream bis = new BufferedInputStream( new FileInputStream(file));
   byte[] buffer = new byte[(int) file.length()];
   int len = bis.read(buffer);
   out.println("HTTP/1.1 200 ok");
   out.println();
   out.write(buffer);
   out.flush();
   out.close();
   
  } catch (FileNotFoundException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
 }
 @Override
 public void run() {
  // TODO Auto-generated method stub
  
  try {
   String fileName = parseReauestHead(this.in); 
   GetFile(fileName);
  } catch (Exception e) {
   // TODO: handle exception
   e.printStackTrace();
  }
  
 }
}

然后在我本地机器上的D盘,新建一个文件夹叫做MyWeb,然后放一张图片,名叫:test.jpg

输入浏览地址:http://localhost:8080/test.jpg

ok:结果:

213909_nl7l_1863482.jpg

大功告成!! 当然这只是简单的模拟一下访问应用程序资源的一个小小的服务器!  如果还要考虑并发,性能,安全,缓存的话肯定还要下很大的功夫。。

 

转载于:https://my.oschina.net/tdd/blog/347330

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值