手寫簡單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;
   }
   
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章