手写简单tomcat

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

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

创建处理请求类

package com.yunhe;
 
import java.io.IOException;
import java.io.InputStream;
 
 
public class HttpRequest {
	
	private String uri;
 
	public String getUri() {
		return uri;
	}
 
	public void setUri(String uri) {
		this.uri = uri;
	}
	
	
	public HttpRequest(InputStream in)  throws IOException{
		resolverRequest(in);
	}
 
	private void resolverRequest(InputStream in) throws IOException {
		
		//1.读取 客户端请求过来的数据,解析出来uri
		byte[] buff = new byte[1024];
		int len = in.read(buff);
		
		if( len>0 ){
			String msg = new String(buff,0,len);
			
			System.out.println("客户端请求信息");
			
			System.out.println("客户端请求过来的数据是:" + msg );
			
			this.uri = msg.substring( 4,msg.indexOf("HTTP/1.1")  );
			
			
			
		}else{
			
			System.out.println("bad request!");
			
		}
		
	}
	
	
	public static void main(String[] args) {
		
	}
	
	
	
}

创建响应类

package com.yunhe;
 
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
 
 
public class HttpResponse {
 
	private OutputStream out = null;
 
	private static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
	
	
	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);
			byte[] buff = new byte[1024];
			int len = 0;
			StringBuffer sb = new StringBuffer();
			//拼凑响应头信息
			sb.append("HTTP/1.1 200 OK\n");
			//sb.append("Content-Type: text/html;charset=UTF-8\n");
			sb.append("\r\n");
			
			
			//响应业务,
			out.write(sb.toString().getBytes());
        
			while((len=fis.read(buff))!=-1){
				out.write(buff,0,len);
			}
	
		fis.close();		
        out.flush();
        out.close();
    
	}
	
	
	
}

 使用tcp创建服务器端

package com.yunhe;
 
 
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.OutputStreamWriter;
import java.net.ServerSocket;
import java.net.Socket;
import java.text.SimpleDateFormat;
import java.util.Date;
 
public class Server {
	
	static SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
	
	
   public static void main(String[] args) {
      try {
     
    	  ServerSocket ss = new ServerSocket(8888);
	      System.out.println("启动服务器....8888端口");
    	  
    	  while(true){
	    	 
	         Socket s = ss.accept();
	         System.out.println("客户端:"+s.getInetAddress().getLocalHost()+"已连接到服务器");
	         
	         BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
	        
	         HttpRequest request = new HttpRequest( s.getInputStream() );
	         
	         String requesturi = request.getUri();
	         
	         System.out.println("请求路径是:"+requesturi);
	         
	         HttpResponse response = new HttpResponse(s.getOutputStream());
	       
	         
	         //if(isStatic(requesturi)){
	         	response.writeFile(requesturi);
	         //}
	         
	         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;
   }
   
}

猜你喜欢

转载自blog.csdn.net/qq_38186465/article/details/102414696