java 简单实现Tomcat(基础)

Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。
这些空洞的文字描述并不能理解tomcat到底是什么玩意,接下来让我们通过代码来理解一波!

  1. 首先来写一个线程用来监测HTTP请求,并且可以多线程访问。代码如下:
public class HttpServer extends Thread{
	private ServerSocket serverSocket;
	public HttpServer(int port) {
		try {
			this.serverSocket=new ServerSocket(port);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}
	public void run() {
		while(true) {
			try {
				System.out.println("tomcat服务器启动");//
				Socket clientSocket=this.serverSocket.accept();
				WorkThread wt=new WorkThread(clientSocket);
				new Thread(wt).start();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	
	
}
  1. 接下来再写一个WorkThread,用来解析HTTP请求,其中HTTP请求可以通过浏览器来查看,代码如下:
public class WorkThread implements Runnable{
	private Socket socket;//保存当前连接的套接字
	public WorkThread(Socket socket) {
		this.socket=socket;
	}
	@Override
	public void run() {
		// TODO Auto-generated method stub
		//处理请求数据和发送响应数据
		try {
			InputStream in=this.socket.getInputStream();
			OutputStream out=this.socket.getOutputStream();
			
			String requestHeadder="";
			BufferedReader br=new BufferedReader(new InputStreamReader(in));
			
			String line=null;
			while((line=br.readLine())!=null&&line.length()>0) {
				requestHeadder+=line+"\r\n";
			}
			String[] headers=requestHeadder.split("\r\n");
			String url=headers[0].split(" ")[1];
			if(url.equals("/index.html")) {//如果请求index.html
				String filePath=this.getClass().getResource("/").getPath();//项目文件路径
				//文件路径中有中文,故解码一下,不然会报错
				filePath = java.net.URLDecoder.decode(filePath,"utf-8");
				File file=new File(filePath+"index.html");
				StringBuilder sb=new StringBuilder();          //StringBuilder方便String串连接
		        sb.append("HTTP/1.0 200 OK\r\n");
		        sb.append("Content-Type: text/html;charset=utf-8\r\n");
		        sb.append("X-Ua-Compatible: IE=Edge,chrome=1\r\n");
		        
		        
		        String path = this.getClass().getResource("/").getPath();
		        System.out.println(path);
			    BufferedReader reader = null;
			    StringBuffer sbf = new StringBuffer();
			    try {
			        reader = new BufferedReader(new FileReader(file));
			        String tempStr;
			        while ((tempStr = reader.readLine()) != null) {
			            sbf.append(tempStr);
			        }
			        reader.close();
			    } catch (IOException e) {
			        e.printStackTrace();
			    } finally {
			        if (reader != null) {
			            try {
			                reader.close();
			            } catch (IOException e1) {
			                e1.printStackTrace();
			            }
			        }
			    }
			    sb.append("Content-length: ").append(sbf.toString().getBytes().length).append("\r\n");
		        sb.append("\r\n");
			    System.out.println(sb.append(sbf.toString()));
		        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
	            bw.write(sb.toString());
	            bw.flush();
			}else if(url.equals("/tomcat.png")) {   // 图片 tomcat.png
				StringBuilder sb=new StringBuilder();
		        sb.append("HTTP/1.0 200 OK\r\n");
		        sb.append("Content-Type: image/png\r\n");
		        sb.append("X-Ua-Compatible: IE=Edge,chrome=1\r\n");
		       
		        String path = this.getClass().getResource("/").getPath();
		        System.out.println(path);
				String fileName = path + "tomcat.png";
				File file = new File(fileName);
				DataInputStream fis=new DataInputStream(new BufferedInputStream(new FileInputStream(file)));
				byte[] theData=new byte[(int)file.length()];
				fis.readFully(theData);
				fis.close();
			    sb.append("Content-length: ").append(theData.length).append("\r\n");
		        sb.append("\r\n");
			    System.out.println(sb.toString());
		        BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(out));
	            bw.write(sb.toString());
	            bw.flush();
	            out.write(theData);
	            out.flush();
				
			}else {
				
			}
			String responseHeader="";//封装应答头
			String responsseContent="<html><head></head>"
					+ "<body>欢迎访问</body>"
					+ "</html>";//封装应答的内容
			
			responseHeader +="HTTP/1.1 200 OK\r\n";
			responseHeader +="Content-type:text/html;charset=utf-8\r\n";
			responseHeader +="Content-length:"+responsseContent.getBytes().length+"\r\n";
			responseHeader +="\r\n";//响应头结束
			
			String content = responseHeader+ responsseContent;
			BufferedWriter bw=new BufferedWriter(new OutputStreamWriter(out));
			bw.write(content);;
			bw.flush();
			
			bw.close();
			in.close();
			out.close();
			socket.close();
			System.out.println(requestHeadder);
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}	
	}	
}

3.index.html和tomcat图片放在src目录下,测试class如下:

public class test {
	public static void main(String[] args) throws InterruptedException {
		new HttpServer(80).start();	
	}
}

运行结果:
在这里插入图片描述
在这里插入图片描述

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值