package Intent;

import java.io.BufferedReader;
import java.io.ByteArrayOutputStream;
import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.net.Socket;
import java.util.ArrayList;
import java.util.Objects;

import ui.MainFrame;

public class Cache {
	private Socket socket;
	private MainFrame mainFrame;
	private String CacheDir = null;
	final static String CRLF = "\r\n";
	private String thefilename;

	public Cache(Socket socket, MainFrame mainFrame, String CacheDir) {
		this.socket = socket;
		this.mainFrame = mainFrame;
		this.CacheDir = CacheDir + "\";
		init();
	}

	void init() {
		try {
			InputStream is = socket.getInputStream();
			DataOutputStream os = new DataOutputStream(socket.getOutputStream());
			BufferedReader br = new BufferedReader(new InputStreamReader(is));
			String requestLine = br.readLine();
			if(null==requestLine) {
				return;
			}

			// Display the request line.
			mainFrame.Messageappend(" ");
			mainFrame.Messageappend(requestLine);
			String type = requestLine.split(" ")[0];
			String url = requestLine.split(" ")[1];

			System.out.println(type);
			System.out.println(url);

			switch (type) {
			case "GET": {
				System.out.println("GET");

				if (!url.startsWith("http"))
					url = "http://" + url;
				if (fileIsNeedUpdate(url)) {//判断更新文件  条件get
					byte[] filecon = WritetoFile(url);
					WriteToClient(is, os, filecon);
				} else {
					String web[] = getfilenameAndDirName(url);
					String webDirname = web[0];
					String webfilename = web[1];
					thefilename = webfilename;
					String filePath = CacheDir + webDirname + transferWebfilename(webfilename);
					System.out.println(filePath);
					WriteToClient(is, os, ReadFile(filePath));
				}

				break;
			}

			default:
				break;
			}
			os.close();
			br.close();
			socket.close();

		} catch (IOException e) {

			e.printStackTrace();
		} catch (Exception e) {

			e.printStackTrace();
		}
	}

	private String contentType(String fileName) {
		String defaultContentType = "text/html";
		if(Objects.isNull(fileName)) {
			return defaultContentType;
		}
		if (fileName.endsWith(".htm") || fileName.endsWith(".jsp") || fileName.endsWith(".php")
					|| fileName.endsWith(".aspx") || fileName.endsWith(".html")) {
				return "text/html";
		}
		if (fileName.endsWith(".css")) {
				return "text/css";
		}
		if (fileName.endsWith(".js")) {
				return "application/x-javascript";
		}

		if (fileName.endsWith(".jpg") || fileName.endsWith(".jpeg")) {
				return "image/jpeg";
		}
		if (fileName.endsWith(".png")) {
				return "image/png";
		}
		if (fileName.endsWith(".ico")) {
				return "image/x-icon";
		}
		if (fileName.indexOf(".") == -1) {
				return "text/html";
		}
		return defaultContentType;
	}

	private boolean fileIsNeedUpdate(String url) {//更新文件
		String[] web = getfilenameAndDirName(url);
		String webfilename = CacheDir + web[0] + web[1];
		webfilename = transferWebfilename(webfilename);
		System.out.println(webfilename + "_____________________________");
		if (!(new File(webfilename).exists())) {
			System.out.println("本记录从缓存读取");
			return true;
		} else
			return false;
	}

	private String[] getfilenameAndDirName(String url) {
		/**
		 * 根据url返回要创建的文件名和目录名
		 */
		String webName = url.split(":")[1];
		String dirlist[] = webName.split("//");
		String dd[] = dirlist[dirlist.length - 1].split("/");
		String webfilename = dd[dd.length - 1];
		if (webfilename.endsWith("/"))
			webfilename = webfilename.substring(0, webfilename.length() - 1);
		String webDirname = dirlist[1];
		System.out.println(webDirname + "_______" + webfilename);

		if (webDirname.startsWith(webfilename) || !webfilename.contains("."))
			webfilename = "index.html";
		else {
			webDirname = webDirname.substring(0, webDirname.length() - webfilename.length());

		}
		System.out.println(webDirname + "_______" + webfilename);
		return new String[] { webDirname, webfilename };
	}

	private byte[] ReadFile(String filepath) {
		ArrayList<Byte> list = new ArrayList<Byte>();
		File file = new File(filepath);
		DataInputStream datainput = null;
		try {
			datainput = new DataInputStream(new FileInputStream(file));
		} catch (FileNotFoundException e) {

			e.printStackTrace();
		}
		ByteArrayOutputStream outStream = new ByteArrayOutputStream();
		byte[] buffer = new byte[1024];
		int len = -1;
		try {
			while ((len = datainput.read(buffer)) != -1) {
				outStream.write(buffer, 0, len);
				for (int i = 0; i < len; i++)
					list.add(new Byte(buffer[i]));
			}
		} catch (IOException e) {

			e.printStackTrace();
		}
		Byte[] str = (Byte[]) list.toArray(new Byte[list.size()]);
		byte[] thefilebyte = new byte[str.length];
		for (int i = 0; i < str.length; i++)
			thefilebyte[i] = str[i].byteValue();
		return thefilebyte;
	}

	private byte[] WritetoFile(String url) {

		Byte[] str = null;
		String web[] = getfilenameAndDirName(url);
		String webDirname = web[0];
		String webfilename = web[1];
		boolean if404;
		try {
			ArrayList<Byte> list = GetContentUrl.getUrlContent(url);//运用动态数组储存
			str = (Byte[]) list.toArray(new Byte[list.size()]);
			if(null == str) {
				return null;
			}
		} catch (IOException e1) {

			e1.printStackTrace();
		}
		byte[] thefilebyte = new byte[str.length];
		try {

			if404 = false;
			webfilename = transferWebfilename(webfilename);
			File webDir = new File(CacheDir + webDirname);


			if (!webDir.exists() && !webDir.isDirectory()) {//不存在就创建
				boolean success = webDir.mkdirs();
				System.out.println("已创建" + webDirname + "\" + webfilename + "目录" + webDir.getPath());//cache存储的路径

			}
			System.out.println("地址" + webDir.getPath());


			File fileWritter = new File(webDir.getPath() + "/" + webfilename);//cache存储路径的地址和文件名
			DataOutputStream bufferWritter = new DataOutputStream(new FileOutputStream(fileWritter));

			for (int i = 0; i < str.length; i++)
				thefilebyte[i] = str[i].byteValue();
			bufferWritter.write(thefilebyte);

			bufferWritter.close();
			thefilename = webfilename;
			System.out.println("缓存成功");

		} catch (IOException e) {
			System.out.println(e.getMessage());
			if404 = true;
		}

		System.out.println();

		return thefilebyte;
	}

	private void WriteToClient(InputStream is, DataOutputStream os, byte[] request) {

		String statusLine = null;
		String contentTypeLine = null;
		String entityBody = null;
		String requestLine = null;
		if (request != null) {
			statusLine = "HTTP/1.1 200 OK" + CRLF;
			contentTypeLine = "Content-type: " + contentType(thefilename) + CRLF;

		} else {

			statusLine = "HTTP/1.1 404 Not Found" + CRLF;
			contentTypeLine = "Content-type: " + contentType(thefilename) + CRLF;
			entityBody = "<!DOCTYPE html><html><head><title>404 Not Found</title></head><body><h1 >404 Not Found</h1><hr/>"
					+ "<p style=\"font-size:30px;\">Sorry!<Br/>该请求没有找到页面, Please Check Your URL Input!</p>"
					+ "</body></html>";
			mainFrame.Messageappend(contentTypeLine);
		}


		try {
			os.writeBytes(statusLine);


			os.writeBytes(contentTypeLine);


			os.writeBytes(CRLF);

			if (request != null) {
				os.write(request);
			}  else {
        os.writeBytes(entityBody);
			}

		} catch (IOException e) {

			e.printStackTrace();
		}

	}

	private String transferWebfilename(String webfilename) {
		return webfilename.replace("?", "");
	}
}

解释代码

内容:这段代码是一个用于实现缓存功能的类。它接受一个Socket对象、一个MainFrame对象和一个缓存目录路径作为参数,用于处理从客户端发送过来的请求,并将响应结果返回给客户端。

在init()方法中,首先读取客户端发送的请求行,根据请求类型进行相应的处理。当前只处理GET请求,其他请求类型可以在switch语句中进行扩展。

在fileIsNeedUpdate()方法中,根据URL判断文件是否需要更新。如果文件不存在,则需要更新。如果文件存在,则不需要更新。

在getfilenameAndDirName()方法中,根据URL获取要创建的文件名和目录名。如果URL以http开头,则从URL中提取出目录名和文件名;否则,将URL作为文件名,并将目录名置为空字符串。

在ReadFile()方法中,从指定文件路径读取文件,并将文件内容以字节数组的形式返回。

在WritetoFile()方法中,通过GetContentUrl类获取URL对应的文件内容,并将文件内容写入缓存目录中。如果文件不存在,则创建目录并写入文件;如果文件已存在,则直接返回。

在WriteToClient()方法中,根据请求结果,构造响应的状态行、内容类型行和实体体,并将响应结果写入到客户端。

最后,在init()方法中关闭输入流、输出流和Socket连接。

这段代码实现了基本的缓存功能,通过判断文件是否需要更新,减少了对网络资源的请求,提高了响应速度。同时,通过将文件内容写入本地缓存,可以减少对网络资源的依赖,提高了程序的稳定性。

Java 缓存机制实现:高效处理网络请求

原文地址: https://www.cveoy.top/t/topic/pTyx 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录