Apache 为HTML页面服务,而Tomcat 实际上运行JSP 页面和Servlet。另外,Tomcat和IIS等Web服务器一样,具有处理HTML页面的功能,另外它还是一个Servlet和JSP容器,独立的Servlet容器是Tomcat的默认模式。
这些空洞的文字描述并不能理解tomcat到底是什么玩意,接下来让我们通过代码来理解一波!
- 首先来写一个线程用来监测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();
}
}
}
}
- 接下来再写一个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();
}
}
运行结果: