Java/Tiny Application/Web Server
Http Server
<source lang="java">
import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; import java.util.StringTokenizer; public class httpServer {
public static void main(String args[]) { int port; ServerSocket server_socket; try { port = Integer.parseInt(args[0]); } catch (Exception e) { port = 1500; } try { server_socket = new ServerSocket(port); System.out.println("httpServer running on port " + server_socket.getLocalPort()); // server infinite loop while (true) { Socket socket = server_socket.accept(); System.out.println("New connection accepted " + socket.getInetAddress() + ":" + socket.getPort()); // Construct handler to process the HTTP request message. try { httpRequestHandler request = new httpRequestHandler(socket); // Create a new thread to process the request. Thread thread = new Thread(request); // Start the thread. thread.start(); } catch (Exception e) { System.out.println(e); } } } catch (IOException e) { System.out.println(e); } }
} class httpRequestHandler implements Runnable {
final static String CRLF = "\r\n"; Socket socket; InputStream input; OutputStream output; BufferedReader br; public httpRequestHandler(Socket socket) throws Exception { this.socket = socket; this.input = socket.getInputStream(); this.output = socket.getOutputStream(); this.br = new BufferedReader(new InputStreamReader(socket .getInputStream())); } public void run() { try { processRequest(); } catch (Exception e) { System.out.println(e); } } private void processRequest() throws Exception { while (true) { String headerLine = br.readLine(); System.out.println(headerLine); if (headerLine.equals(CRLF) || headerLine.equals("")) break; StringTokenizer s = new StringTokenizer(headerLine); String temp = s.nextToken(); if (temp.equals("GET")) { String fileName = s.nextToken(); fileName = "." + fileName; FileInputStream fis = null; boolean fileExists = true; try { fis = new FileInputStream(fileName); } catch (FileNotFoundException e) { fileExists = false; } String serverLine = "Server: Simple Java Http Server"; String statusLine = null; String contentTypeLine = null; String entityBody = null; String contentLengthLine = "error"; if (fileExists) { statusLine = "HTTP/1.0 200 OK" + CRLF; contentTypeLine = "Content-type: " + contentType(fileName) + CRLF; contentLengthLine = "Content-Length: " + (new Integer(fis.available())).toString() + CRLF; } else { statusLine = "HTTP/1.0 404 Not Found" + CRLF; contentTypeLine = "text/html"; entityBody = "<HTML>" + "<HEAD><TITLE>404 Not Found</TITLE></HEAD>" + "<BODY>404 Not Found" + "
usage:http://yourHostName:port/" + "fileName.html</BODY></HTML>"; } // Send the status line. output.write(statusLine.getBytes()); System.out.println(statusLine); // Send the server line. output.write(serverLine.getBytes()); System.out.println(serverLine); // Send the content type line. output.write(contentTypeLine.getBytes()); System.out.println(contentTypeLine); // Send the Content-Length output.write(contentLengthLine.getBytes()); System.out.println(contentLengthLine); // Send a blank line to indicate the end of the header lines. output.write(CRLF.getBytes()); System.out.println(CRLF); // Send the entity body. if (fileExists) { sendBytes(fis, output); fis.close(); } else { output.write(entityBody.getBytes()); } } } try { output.close(); br.close(); socket.close(); } catch (Exception e) { } } private static void sendBytes(FileInputStream fis, OutputStream os) throws Exception { byte[] buffer = new byte[1024]; int bytes = 0; while ((bytes = fis.read(buffer)) != -1) { os.write(buffer, 0, bytes); } } private static String contentType(String fileName) { if (fileName.endsWith(".htm") || fileName.endsWith(".html") || fileName.endsWith(".txt")) { return "text/html"; } else if (fileName.endsWith(".jpg") || fileName.endsWith(".jpeg")) { return "image/jpeg"; } else if (fileName.endsWith(".gif")) { return "image/gif"; } else { return "application/octet-stream"; } }
}
</source>