Java 实现 web服务器的简单实例
2017-06-26 1351
ava 实现 web服务器的简单实例
实例代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 | 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("//")) 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); } } |
上一篇:投资性房地产入账价值的确认