Java 實(shí)現(xiàn) web服務(wù)器的簡(jiǎn)單實(shí)例
Java 實(shí)現(xiàn) web服務(wù)器的簡(jiǎn)單實(shí)例
實(shí)例代碼:
import java.util.*; // Chapter 8, Listing 3 public class WebServerDemo { // Directory of HTML pages and other files protected String docroot; // Port number of web server protected int port; // Socket for the web server protected ServerSocket ss; // Handler for a HTTP request class Handler extends Thread { protected Socket socket; protected PrintWriter pw; protected BufferedOutputStream bos; protected BufferedReader br; protected File docroot; public Handler(Socket _socket, String _docroot) throws Exception { socket = _socket; // Get the absolute directory of the filepath docroot = new File(_docroot).getCanonicalFile(); } public void run() { try { // Prepare our readers and writers br = new BufferedReader(new InputStreamReader( socket.getInputStream())); bos = new BufferedOutputStream(socket.getOutputStream()); pw = new PrintWriter(new OutputStreamWriter(bos)); // Read HTTP request from user (hopefully GET /file...... ) String line = br.readLine(); // Shutdown any further input socket.shutdownInput(); if (line == null) { socket.close(); return; } if (line.toUpperCase().startsWith("GET")) { // Eliminate any trailing ? data, such as for a CGI GET // request StringTokenizer tokens = new StringTokenizer(line, " ?"); tokens.nextToken(); String req = tokens.nextToken(); // If a path character / or / is not present, add it to the // document root // and then add the file request, to form a full filename String name; if (req.startsWith("/") || req.startsWith("http://")) name = this.docroot + req; else name = this.docroot + File.separator + req; // Get absolute file path File file = new File(name).getCanonicalFile(); // Check to see if request doesn't start with our document // root .... if (!file.getAbsolutePath().startsWith( this.docroot.getAbsolutePath())) { pw.println("HTTP/1.0 403 Forbidden"); pw.println(); } // ... if it's missing ..... else if (!file.exists()) { pw.println("HTTP/1.0 404 File Not Found"); pw.println(); } // ... if it can't be read for security reasons .... else if (!file.canRead()) { pw.println("HTTP/1.0 403 Forbidden"); pw.println(); } // ... if its actually a directory, and not a file .... else if (file.isDirectory()) { sendDir(bos, pw, file, req); } // ... or if it's really a file else { sendFile(bos, pw, file.getAbsolutePath()); } } // If not a GET request, the server will not support it else { pw.println("HTTP/1.0 501 Not Implemented"); pw.println(); } pw.flush(); bos.flush(); } catch (Exception e) { e.printStackTrace(); } try { socket.close(); } catch (Exception e) { e.printStackTrace(); } } protected void sendFile(BufferedOutputStream bos, PrintWriter pw, String filename) throws Exception { try { java.io.BufferedInputStream bis = new java.io.BufferedInputStream( new FileInputStream(filename)); byte[] data = new byte[10 * 1024]; int read = bis.read(data); pw.println("HTTP/1.0 200 Okay"); pw.println(); pw.flush(); bos.flush(); while (read != -1) { bos.write(data, 0, read); read = bis.read(data); } bos.flush(); } catch (Exception e) { pw.flush(); bos.flush(); } } protected void sendDir(BufferedOutputStream bos, PrintWriter pw, File dir, String req) throws Exception { try { pw.println("HTTP/1.0 200 Okay"); pw.println(); pw.flush(); pw.print("<html><head><title>Directory of "); pw.print(req); pw.print("</title></head><body><h1>Directory of "); pw.print(req); pw.println("</h1><table border=/"0/">"); File[] contents = dir.listFiles(); for (int i = 0; i < contents.length; i++) { pw.print("<tr>"); pw.print("<td><a href="/" rel="external nofollow" rel="external nofollow" mce_href="/" rel="external nofollow" rel="external nofollow" ""); pw.print(req); pw.print(contents[i].getName()); if (contents[i].isDirectory()) pw.print("/"); pw.print("/">"); if (contents[i].isDirectory()) pw.print("Dir -> "); pw.print(contents[i].getName()); pw.print("</a></td>"); pw.println("</tr>"); } pw.println("</table></body></html>"); pw.flush(); } catch (Exception e) { pw.flush(); bos.flush(); } } } // Check that a filepath has been specified and a port number protected void parseParams(String[] args) throws Exception { switch (args.length) { case 1: case 0: System.err.println("Syntax: <jvm> " + this.getClass().getName() + " docroot port"); System.exit(0); default: this.docroot = args[0]; this.port = Integer.parseInt(args[1]); break; } } public WebServerDemo(String[] args) throws Exception { System.out.println("Checking for paramters"); // Check for command line parameters parseParams(args); System.out.print("Starting web server...... "); // Create a new server socket this.ss = new ServerSocket(this.port); System.out.println("OK"); for (;;) { // Accept a new socket connection from our server socket Socket accept = ss.accept(); // Start a new handler instance to process the request new Handler(accept, docroot).start(); } } // Start an instance of the web server running public static void main(String[] args) throws Exception { WebServerDemo webServerDemo = new WebServerDemo(args); } }
感謝閱讀,希望能幫助到大家,謝謝大家對(duì)本站的支持!
- java實(shí)現(xiàn)一個(gè)簡(jiǎn)單的Web服務(wù)器實(shí)例解析
- java 與web服務(wù)器鏈接的實(shí)例
- AngularJS實(shí)現(xiàn)與Java Web服務(wù)器交互操作示例【附demo源碼下載】
- 基于Java web服務(wù)器簡(jiǎn)單實(shí)現(xiàn)一個(gè)Servlet容器
- 簡(jiǎn)單實(shí)現(xiàn)Java web服務(wù)器
- Java實(shí)現(xiàn)簡(jiǎn)易Web服務(wù)器
- Java中常見的5種WEB服務(wù)器介紹
- Java Socket編程(五) 簡(jiǎn)單的WEB服務(wù)器
- 搭建JavaWeb服務(wù)器步驟詳解
相關(guān)文章
基于jsp實(shí)現(xiàn)新聞管理系統(tǒng) 附完整源碼
這篇文章主要介紹了基于jsp的新聞管理系統(tǒng),具有一定的參考價(jià)值,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2016-09-09實(shí)例講解JSP Model2體系結(jié)構(gòu)(上)
實(shí)例講解JSP Model2體系結(jié)構(gòu)(上)...2006-10-10jsp利用application統(tǒng)計(jì)在線人數(shù)的方法
這篇文章主要介紹了jsp利用application統(tǒng)計(jì)在線人數(shù)的方法,代碼中備有較為詳盡的注釋便于理解,是比較實(shí)用的技巧,需要的朋友可以參考下2015-01-01利用jsp+mysql實(shí)現(xiàn)好看的登錄與注冊(cè)頁面(動(dòng)態(tài)背景)
最近在學(xué)jsp連接數(shù)據(jù)庫,存?zhèn)€檔吧,下面這篇文章主要給大家介紹了關(guān)于利用jsp+mysql實(shí)現(xiàn)好看的登錄與注冊(cè)頁面(動(dòng)態(tài)背景)的相關(guān)資料,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2024-01-01JSP上傳圖片產(chǎn)生 java.io.IOException: Stream closed異常解決方法
在做jsp上傳圖片時(shí),把java代碼直接改成 jsp,上傳時(shí)產(chǎn)生異常,很是疑惑,于是搜索整理了一下解決方法,需要了解的朋友可以參考下2012-12-12jsp+servlet+jdbc實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的增刪改查
本篇文章主要介紹了jsp+servlet+jdbc實(shí)現(xiàn)對(duì)數(shù)據(jù)庫的增刪改查,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2017-01-01