简单了解tocat底层原理,手写简单tomcat

模拟http协议所以需要处理请求与封装响应

之后在服务器端就可以进行使用

创建处理请求类

package com.zhou;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.HashMap;
public class HttpRequest {
	//客户端请求的uri
	private String allUri;
	//请求的服务uri
	private String uri;
	//从请求解析的数据
	private HashMap<String, String> values=new HashMap<>();
	
	public String getAllUri() {
		return allUri;
	}
	public void setAllUri(String allUri) {
		this.allUri = allUri;
	}
	public String getUri() {
		return uri;
	}
	public void setUri(String uri) {
		this.uri = uri;
	}
	public HashMap<String, String> getValues() {
		return values;
	}
	public void setValues(HashMap<String, String> values) {
		this.values = values;
	}
	public HttpRequest(InputStream in)  throws IOException{
		resolverRequest(in);
	}
	private void resolverRequest(InputStream in) throws IOException {
		//获取输入流中数据
		InputStreamReader isr=new InputStreamReader(in);
	    BufferedReader br=new BufferedReader(isr);
	  //读取 客户端请求过来的数据,获取请求头解析出来uri
	    String requestHead=br.readLine();
	    //包含数据在内的uri
	    allUri=requestHead.split(" ")[1];
	    //请求的uri
	    this.uri=allUri.split("\\?")[0];
	    //判断请求是否是静态资源不是则解析数据
	   if(!Server.isStatic(allUri)) {
		   //数据字符串username=adas&password=11111
		    String dataStr=allUri.split("\\?")[1];
		    toMap(dataStr);
	   }
	}
	//将字符串数据转换为map
	 public void toMap(String dataStr) {
		 String[] split = dataStr.split("&");
		 for (String string : split) {
			 String[] data = string.split("=");
			 values.put(data[0], data[1]);
		}
	 }
	@Override
	public String toString() {
		return "HttpRequest [allUri=" + allUri + ", uri=" + uri + ", values=" + values + "]";
	} 
	}

创建响应类

package com.zhou;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
public class HttpResponse {
	// 获取输出流用于响应
	private OutputStream out = null;
	public HttpResponse(OutputStream out) {
		super();
		this.out = out;
	}
	// 这个方法的作用是把请求的地址传递进来,服务器这个时候向客户端回写响应的文件数据等
	public void writeFile(String path) throws IOException {
		// 获取当前项目路径用于返回当前项目下静态资源
		String basepath = new File("").getCanonicalPath();
		FileInputStream fis = new FileInputStream(basepath + "/" + path);
		StringBuffer sb = new StringBuffer();
		// 拼凑响应头信息
		sb.append("HTTP/1.1 200 OK\n");
		sb.append("\r\n");
		byte[] buff = new byte[1024];
		int len = 0;
		// 响应业务,
		out.write(sb.toString().getBytes());
		while ((len = fis.read(buff)) != -1) {
			out.write(buff, 0, len);
		}
		fis.close();
		out.flush();
		out.close();
	}
	public void exec(HttpRequest request) throws IOException {
		 System.out.println("请求的服务:"+request.getUri().substring(1));
		 System.out.println("请求的数据:"+request.getValues());
		 //通过预先配置将uri与处理的服务绑定
		 //通过url获取服务 反射执行相应方法进行服务执行
	}
}

使用tcp创建服务器端

package com.zhou;
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;
public class Server {
   public static void main(String[] args) {
      try {
    	  ServerSocket ss = new ServerSocket(8888);
	      System.out.println("启动服务器....8888端口");
    		 //阻塞方法获取客户端对象
	         Socket s = ss.accept();
	         //创建相应的请求相应对象
	         HttpRequest request = new HttpRequest( s.getInputStream() );
	         HttpResponse response = new HttpResponse(s.getOutputStream());
	         //System.out.println("客户端:"+s.getInetAddress().getLocalHost()+"已连接到服务器");
	         String requesturi = request.getUri();
	         System.out.println(request);
	         //如果请求静态资源直接返回
	         if(isStatic(requesturi)){
	         	response.writeFile(request.getUri());
	         }else {
	        	 response.exec(request);
	         }
	         s.close();
    	  
      } catch (IOException e) {
         e.printStackTrace();
      }
   }
   //一些静态资源的判断(可以在数组中进行添加)
   public static boolean isStatic( String uri ){
	   boolean isStatic = false;
	   String []suffixs = {"html","css","js","jpg","png","gif","bmp"};
	   for( String suffix : suffixs){
		   if(uri.endsWith("."+suffix)){
			   isStatic = true;
			   break;
		   }
	   }
	   return isStatic;
   }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值