搞一个自创Tomcat?
作者:互联网
在JavaEE中,有一个服务器,叫Tomcat,可以显示jsp页面,虽然我不是很了解它,但是javase我了解,是否可以自制一个Tomcat呢?
想到web服务器,我们可以联想到javase的网络编程,我们可以创建一个ServerSocket,然后让它监听8080端口,如果有客户机连接,可以读取它的请求,然后发送相应的响应。
上代码:
package com.tomcat.http;
import java.io.*;
import java.net.*;
import java.text.SimpleDateFormat;
import java.util.Date;
/**
* <h1>web服务器类,new它可以创建一个web服务器。</h1>
*
* @author CKF
* @since 1.0
* @see java.io.IOException
* @see com.tomcat.http.Request
* @see com.tomcat.http.Response
*/
public class HttpServer {
private ServerSocket server;
private Socket s;
private int port;
private boolean b = true;
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
Date date = new Date(System.currentTimeMillis());
/**
* 它可以构造一个web服务器
*
* @author CKF
* @param port web服务器的端口
*/
public HttpServer(int port) {
server = null;
s = null;
this.port = port;
try {
server = new ServerSocket(this.port, 3, InetAddress.getByName("127.0.0.1"));
} catch (IOException e) {
e.printStackTrace();
System.exit(0);
}
System.out.println("[" + formatter.format(date) + "/serverINFO" + "]" + "web服务器创建成功");
}
public boolean isB() {
return b;
}
public void setB(boolean b) {
this.b = b;
}
/**
* 它将运行这个服务器
*
* @author CKF
*/
public void runHttpServer() {
while (true) {
try {
s = server.accept();
if (b == true) {
OutputStream output = s.getOutputStream();
InputStream input = s.getInputStream();
System.out.println(
"[" + formatter.format(date) + "/SERVERINFO" + "]" + s.getInetAddress().getHostName() + "连接");
// 接收请求信息
Request request = new Request(input);
String filename = request.getUri();
// System.out.println(filename);
// 处理并响应请求信息
Response response = new Response(output, filename);
response.response();
} else {
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
拉拉,这个就是主程序了,当然,还有两个类,代表请求和响应:
Request:
package com.tomcat.http;
import java.io.*;
/**
* 代表一个请求。
*
* @author CKF
* @since 1.0
* @see java.io.IOException
*/
public class Request {
/*
* 接收请求的信息,并返回资源(文件名)
*/
InputStream input;
public Request(InputStream input) {
this.input = input;
}
public String getUri() throws IOException {
String content = null;
StringBuffer request = new StringBuffer();
byte[] buffer = new byte[2048];
int i = 0;
try {
i = input.read(buffer); // 读取内容并存入buffer数组中,并返回读取的的字节数。
} catch (IOException e) {
e.printStackTrace();
i = -1;
}
// 将buffer数组转换为字符串
for (int k = 0; k < i; k++) {
request.append((char) buffer[k]);
}
content = request.toString();
if (content != null)
return getFilename(content);
else
return null;
}
/* 提取文件名 */
public String getFilename(String content) {
int a, b;
a = content.indexOf(' ');
if (a != -1) {
b = content.indexOf('?', a + 1);
if (b == -1)
b = content.indexOf(' ', a + 1);
return content.substring(a + 2, b);
}
return null;
}
}
Response:
package com.tomcat.http;
import java.io.*;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
/**
* 代表一个响应。
*
* @author CKF
* @since 1.0
*/
public class Response {
/**
* 响应并处理请求信息
*/
public OutputStream output;
public String filename;
private static final int BUFFER_SIZE = 1024;
public Response(OutputStream output, String filename) {
this.output = output;
this.filename = filename;
}
public void response() throws IOException {
String path = "D:/JavaWebServerHtmlRoot";// 获取当前的工作目录
byte[] buffer = new byte[BUFFER_SIZE];
int ch;
FileInputStream fis = null;
if (path != null && filename != null) {
File file = new File(path, filename);
String str = "";
/* 必须添加响应头,否则无法以html格式显示内容 */
if (file.exists()) {
fis = new FileInputStream(file);
str = "HTTP/1.1 200 OK \r\n" + "Content-Type: text/html\r\n" + "\r\n";
output.write(str.getBytes());
ch = fis.read(buffer);
while (ch != -1) {
output.write(buffer, 0, ch);
ch = fis.read(buffer, 0, BUFFER_SIZE);
}
} else {
str = "HTTP/1.1 404 File Not Found \r\n" + "Content-Type: text/html\r\n" + "Content-Length: 100\r\n"
+ "\r\n" + "<h1>404 File Not Found!</h1>";
output.write(str.getBytes());
}
}
output.close();
}
}
好了Y(^o^)Y,这样创建一个HttpServer类,再运行runHttpServer()方法就可以了。
如果你运行出错,请检查您设置的端口是否被占用。
好了今天就到这里,拜拜。
标签:java,Tomcat,自创,一个,import,filename,output,new,public 来源: https://blog.csdn.net/m0_62119670/article/details/120871321