{"title":"package Intent; \n\nimport java.io.BufferedReader; \nimport java.io.ByteArrayOutputStream; \nimport java.io.DataInputStream; \nimport java.io.DataOutputStream; \nimport java.io.File; \nimport java.io.FileInputStream; \nimport java.io.FileNotFoundException; \nimport java.io.FileOutputStream; \nimport java.io.IOException; \nimport java.io.InputStream; \nimport java.io.InputStreamReader; \nimport java.io.OutputStream; \nimport java.net.Socket; \nimport java.util.ArrayList; \nimport java.util.Objects; \n\nimport ui.MainFrame; \n\npublic class Cache { \n\tprivate Socket socket; \n\tprivate MainFrame mainFrame; \n\tprivate String CacheDir = null; \n\tfinal static String CRLF = "\r\n"; \n\tprivate String thefilename; \n\n\tpublic Cache(Socket socket, MainFrame mainFrame, String CacheDir) { \n\t\tthis.socket = socket; \n\t\tthis.mainFrame = mainFrame; \n\t\tthis.CacheDir = CacheDir + "\"; \n\t\tinit(); \n\t} \n\n\tvoid init() { \n\t\ttry { \n\t\t\tInputStream is = socket.getInputStream(); \n\t\t\tDataOutputStream os = new DataOutputStream(socket.getOutputStream()); \n\t\t\tBufferedReader br = new BufferedReader(new InputStreamReader(is)); \n\t\t\tString requestLine = br.readLine(); \n\t\t\tif(null==requestLine) { \n\t\t\t\treturn; \n\t\t\t} \n\n\t\t\t// Display the request line. \n\t\t\tmainFrame.Messageappend(" "); \n\t\t\tmainFrame.Messageappend(requestLine); \n\t\t\tString type = requestLine.split(" ")[0]; \n\t\t\tString url = requestLine.split(" ")[1]; \n\n\t\t\tSystem.out.println(type); \n\t\t\tSystem.out.println(url); \n\n\t\t\tswitch (type) { \n\t\t\tcase "GET": { \n\t\t\t\tSystem.out.println("GET"); \n\n\t\t\t\tif (!url.startsWith("http")) \n\t\t\t\t\turl = "http://" + url; \n\t\t\t\tif (fileIsNeedUpdate(url)) {//判断更新文件 条件get \n\t\t\t\t\tbyte[] filecon = WritetoFile(url); \n\t\t\t\t\tWriteToClient(is, os, filecon); \n\t\t\t\t} else { \n\t\t\t\t\tString web[] = getfilenameAndDirName(url); \n\t\t\t\t\tString webDirname = web[0]; \n\t\t\t\t\tString webfilename = web[1]; \n\t\t\t\t\tthefilename = webfilename; \n\t\t\t\t\tString filePath = CacheDir + webDirname + transferWebfilename(webfilename); \n\t\t\t\t\tSystem.out.println(filePath); \n\t\t\t\t\tWriteToClient(is, os, ReadFile(filePath)); \n\t\t\t\t} \n\n\t\t\t\tbreak; \n\t\t\t} \n\n\t\t\tdefault: \n\t\t\t\tbreak; \n\t\t\t} \n\t\t\tos.close(); \n\t\t\tbr.close(); \n\t\t\tsocket.close(); \n\n\t\t} catch (IOException e) { \n\n\t\t\te.printStackTrace(); \n\t\t} catch (Exception e) { \n\n\t\t\te.printStackTrace(); \n\t\t} \n\t} \n\n\tprivate String contentType(String fileName) { \n\t\tString defaultContentType = "text/html"; \n\t\tif(Objects.isNull(fileName)) { \n\t\t\treturn defaultContentType; \n\t\t} \n\t\tif (fileName.endsWith(".htm") || fileName.endsWith(".jsp") || fileName.endsWith(".php") \n\t\t\t\t\t|| fileName.endsWith(".aspx") || fileName.endsWith(".html")) { \n\t\t\treturn "text/html"; \n\t\t} \n\t\tif (fileName.endsWith(".css")) { \n\t\t\treturn "text/css"; \n\t\t} \n\t\tif (fileName.endsWith(".js")) { \n\t\t\treturn "application/x-javascript"; \n\t\t} \n\n\t\tif (fileName.endsWith(".jpg") || fileName.endsWith(".jpeg")) { \n\t\t\treturn "image/jpeg"; \n\t\t} \n\t\tif (fileName.endsWith(".png")) { \n\t\t\treturn "image/png"; \n\t\t} \n\t\tif (fileName.endsWith(".ico")) { \n\t\t\treturn "image/x-icon"; \n\t\t} \n\t\tif (fileName.indexOf(".") == -1) { \n\t\t\treturn "text/html"; \n\t\t} \n\t\treturn defaultContentType; \n\t} \n\n\tprivate boolean fileIsNeedUpdate(String url) {//更新文件 \n\t\tString[] web = getfilenameAndDirName(url); \n\t\tString webfilename = CacheDir + web[0] + web[1]; \n\t\twebfilename = transferWebfilename(webfilename); \n\t\tSystem.out.println(webfilename + "_____________________________"); \n\t\tif (!(new File(webfilename).exists())) { \n\t\t\tSystem.out.println("本记录从缓存读取"); \n\t\t\treturn true; \n\t\t} else \n\t\t\treturn false; \n\t} \n\n\tprivate String[] getfilenameAndDirName(String url) { \n\t\t/** \n\t\t * 根据url返回要创建的文件名和目录名 \n\t\t */ \n\t\tString webName = url.split(":")[1]; \n\t\tString dirlist[] = webName.split("//"); \n\t\tString dd[] = dirlist[dirlist.length - 1].split("/"); \n\t\tString webfilename = dd[dd.length - 1]; \n\t\tif (webfilename.endsWith("/")) \n\t\t\twebfilename = webfilename.substring(0, webfilename.length() - 1); \n\t\tString webDirname = dirlist[1]; \n\t\tSystem.out.println(webDirname + "" + webfilename); \n\n\t\tif (webDirname.startsWith(webfilename) || !webfilename.contains(".")) \n\t\t\twebfilename = "index.html"; \n\t\telse { \n\t\t\twebDirname = webDirname.substring(0, webDirname.length() - webfilename.length()); \n\n\t\t} \n\t\tSystem.out.println(webDirname + "" + webfilename); \n\t\treturn new String[] { webDirname, webfilename }; \n\t} \n\n\tprivate byte[] ReadFile(String filepath) { \n\t\tArrayList list = new ArrayList(); \n\t\tFile file = new File(filepath); \n\t\tDataInputStream datainput = null; \n\t\ttry { \n\t\t\tdatainput = new DataInputStream(new FileInputStream(file)); \n\t\t} catch (FileNotFoundException e) { \n\n\t\t\te.printStackTrace(); \n\t\t} \n\t\tByteArrayOutputStream outStream = new ByteArrayOutputStream(); \n\t\tbyte[] buffer = new byte[1024]; \n\t\tint len = -1; \n\t\ttry { \n\t\t\twhile ((len = datainput.read(buffer)) != -1) { \n\t\t\t\toutStream.write(buffer, 0, len); \n\t\t\t\tfor (int i = 0; i < len; i++) \n\t\t\t\t\tlist.add(new Byte(buffer[i])); \n\t\t\t} \n\t\t} catch (IOException e) { \n\n\t\t\te.printStackTrace(); \n\t\t} \n\t\tByte[] str = (Byte[]) list.toArray(new Byte[list.size()]); \n\t\tbyte[] thefilebyte = new byte[str.length]; \n\t\tfor (int i = 0; i < str.length; i++) \n\t\t\tthefilebyte[i] = str[i].byteValue(); \n\t\treturn thefilebyte; \n\t} \n\n\tprivate byte[] WritetoFile(String url) { \n\n\t\tByte[] str = null; \n\t\tString web[] = getfilenameAndDirName(url); \n\t\tString webDirname = web[0]; \n\t\tString webfilename = web[1]; \n\t\tboolean if404; \n\t\ttry { \n\t\t\tArrayList list = GetContentUrl.getUrlContent(url);//运用动态数组储存 \n\t\t\tstr = (Byte[]) list.toArray(new Byte[list.size()]); \n\t\t\tif(null == str) { \n\t\t\t\treturn null; \n\t\t\t} \n\t\t} catch (IOException e1) { \n\n\t\t\te1.printStackTrace(); \n\t\t} \n\t\tbyte[] thefilebyte = new byte[str.length]; \n\t\ttry { \n\n\t\t\tif404 = false; \n\t\t\twebfilename = transferWebfilename(webfilename); \n\t\t\tFile webDir = new File(CacheDir + webDirname); \n\n\n\t\t\tif (!webDir.exists() && !webDir.isDirectory()) {//不存在就创建 \n\t\t\t\tboolean success = webDir.mkdirs(); \n\t\t\t\tSystem.out.println("已创建" + webDirname + "\" + webfilename + "目录" + webDir.getPath());//cache存储的路径 \n\n\t\t\t} \n\t\t\tSystem.out.println("地址" + webDir.getPath()); \n\n\n\t\t\tFile fileWritter = new File(webDir.getPath() + "/" + webfilename);//cache存储路径的地址和文件名 \n\t\t\tDataOutputStream bufferWritter = new DataOutputStream(new FileOutputStream(fileWritter)); \n\n\t\t\tfor (int i = 0; i < str.length; i++) \n\t\t\t\tthefilebyte[i] = str[i].byteValue(); \n\t\t\tbufferWritter.write(thefilebyte); \n\n\t\t\tbufferWritter.close(); \n\t\t\tthefilename = webfilename; \n\t\t\tSystem.out.println("缓存成功"); \n\n\t\t} catch (IOException e) { \n\t\t\tSystem.out.println(e.getMessage()); \n\t\t\tif404 = true; \n\t\t} \n\n\t\tSystem.out.println(); \n\n\t\treturn thefilebyte; \n\t} \n\n\tprivate void WriteToClient(InputStream is, DataOutputStream os, byte[] request) { \n\n\t\tString statusLine = null; \n\t\tString contentTypeLine = null; \n\t\tString entityBody = null; \n\t\tString requestLine = null; \n\t\tif (request != null) { \n\t\t\tstatusLine = "HTTP/1.1 200 OK" + CRLF; \n\t\t\tcontentTypeLine = "Content-type: " + contentType(thefilename) + CRLF; \n\n\t\t} else { \n\n\t\t\tstatusLine = "HTTP/1.1 404 Not Found" + CRLF; \n\t\t\tcontentTypeLine = "Content-type: " + contentType(thefilename) + CRLF; \n\t\t\tentityBody = "404 Not Found

404 Not Found


" \n\t\t\t\t\t+ "<p style="font-size:30px;">Sorry!
该请求没有找到页面, Please Check Your URL Input!

" \n\t\t\t\t\t+ ""; \n\t\t\tmainFrame.Messageappend(contentTypeLine); \n\t\t} \n\n\n\t\ttry { \n\t\t\tos.writeBytes(statusLine); \n\n\n\t\t\tos.writeBytes(contentTypeLine); \n\n\n\t\t\tos.writeBytes(CRLF); \n\n\t\t\tif (request != null) { \n\t\t\t\tos.write(request); \n\t\t\t} else { \n\t\t\t\tos.writeBytes(entityBody); \n\t\t\t} \n\n\n\t\t} catch (IOException e) { \n\n\t\t\te.printStackTrace(); \n\t\t} \n\n\t} \n\n\tprivate String transferWebfilename(String webfilename) { \n\t\treturn webfilename.replace("?", ""); \n\t} \n}

Java HTTP 缓存实现: 提升网站性能的利器

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

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