简单模拟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网页都是乱码。。。
如果有知道的大佬可以评论解决一下。