一个简单的Tomcat模拟

1 篇文章 0 订阅
1 篇文章 0 订阅

简单模拟tomcat

Tomcat帮我们实现了网页与服务器之间的信息交互,这里我实现一下在浏览器中输入ip:端口/资源,出现一个网页的。
我们在写Servlet的时候doGet方法中有两个参数request与response,req是接受网页信息,resp是向网页返回数据。现在我就是基于这两个写代码。

import java.io.BufferedInputStream;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.Socket;

public class MyThread extends Thread {
	private Socket socket = null;

	private BufferedReader in = null;
	private PrintStream out = null;

	private BufferedInputStream fileInputStream = null;

	private String path = null;

	public MyThread() {
	}

	public MyThread(Socket socket) {
		this.socket = socket;
	}

	public void run() {
		try {
			
			in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
			
			//请求消息包含三部分: 请求行 消息报头 请求正文(资源请求)
			String line = null;
			line = in.readLine();
			String method = line.split(" ")[0];
			System.out.println(line+"\n请求方法:"+method);
			String uri = line.split(" ")[1];
			
			
			out = new PrintStream(socket.getOutputStream());
			
			File file = new File(this.find(uri));
			fileInputStream = new BufferedInputStream(new FileInputStream(file));
			
//			这是一个我编程过程中的一个问题测试 最后有说明		
//			String filename = "F:\\outUri";
//			PrintStream outUri = new PrintStream(new FileOutputStream(filename));
			
			/*HTTP响应也是由三个部分组成
			 *分别是: 响应状态行、消息报头、响应正文
			 */
			out.println("HTTP"+"/1.1 200 OK");//响应状态行
			out.println("Content-Type: text/html;Charset=GBK");//消息报头
			out.println("Content-Length: "+file.length());
			out.println();
			
			byte[] buf = new byte[1024];
            int length = 0;
            while ( (length = fileInputStream.read(buf)) != -1 ) {
            	out.write(buf,0,length);
            	out.flush();
            	
//                outUri.write(buf, 0, length);
//                outUri.flush();
            }

			out.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public String find(String uri) {
		if("/".equals(uri)) {
			//默认返回资源
			path="src/mytomcat/source/welcom.html";
		}else {
			//ip:端口/资源 这里uri就是在网页资源请求
			path="src/mytomcat/source"+uri;
			File file = new File(path);
			if(!file.exists()) {
				//如果没有对应的资源返回一个错误页面
				path="src/mytomcat/source/error.html";
			}
		}
		
		return path;
	}
}

因为我们在浏览网页的时候服务器是一直在运行,并不是交互一次就结束,所以我就抛一个新的线程来运行代码。
启动服务器

import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;



public class Server{
	//端口号
	final int port = 8887;
	String path = null;
	ServerSocket serverSocket = null;
	
	public Server() {
		try {
			serverSocket = new ServerSocket(port);
			System.out.println("服务器启动");
//			this.run();
			while(true) {
				Socket socket = serverSocket.accept();
				System.out.println(socket);
				
				new MyThread(socket).start();
				
			}
			
			
		} catch (IOException e) {
			// TODO Auto-generated catch block
			System.out.println("端口被占用"+e.getMessage());;
		}finally {
			try {
				if(serverSocket!=null)serverSocket.close();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args) {
		new Server();
	}
}

资源文件source
在这里插入图片描述
默认资源结果:
在这里插入图片描述
请求资源结果:
在这里插入图片描述资源可以自己写几个HTML文件

说一下问题
返回图片资源时,我本来想的是直接获取不通过HTML文件获取,也就是浏览器请求资源时写/photo.jpg,然后网页上呈现此图片。
但是我在执行代码时网页上呈现的是乱码,我想是不是io类型的问题,然后我就试了BufferedReader,BufferedInputstream,InputStreamReader网页都是乱码。。。
如果有知道的大佬可以评论解决一下。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值