import java.io.*; import java.net.*; import java.util.*; public final class WebServer { public static void main(String[] args) throws Exception { // Establish the listen socket. ServerSocket wS = new ServerSocket(6789); while (true) { // Listen for a TCP connection request. Socket cS = wS.accept(); // Construct an object to process the HTTP request message. HttpRequest request = new HttpRequest(cS); // Create a new thread to process the request. Thread thread = new Thread(request); // Start the thread. thread.start(); } } } import java.io.*; import java.net.*; import java.util.*; final class HttpRequest implements Runnable { final static String CRLF = "\r\n"; Socket socket; // Constructor public HttpRequest(Socket socket) throws Exception { this.socket = socket; } public void run() { try { processRequest(); } catch (Exception e) { System.out.println(e); } } private void processRequest() throws Exception { InputStream is = socket.getInputStream(); DataOutputStream os = new DataOutputStream(socket.getOutputStream()); BufferedReader br = new BufferedReader(new InputStreamReader(is)); String requestLine = br.readLine(); // Display the request line. System.out.println(); System.out.println(requestLine); String headerLine = null; while ((headerLine = br.readLine()).length()!=0) { System.out.println(headerLine); } // Extract the filename from the request line. StringTokenizer tokens = new StringTokenizer(requestLine); tokens.nextToken(); tokens.nextToken(); // skip over the method, which should be �GET� String fileName = tokens.nextToken(); // Prepend a �.� so that file request is within the current directory. fileName = "." + fileName; System.out.println("Filename to Get"+fileName); // Open the requested file. FileInputStream fis = null; boolean fileExists = true; try { fis = new FileInputStream("webtext.html"); } catch (FileNotFoundException e) { fileExists = false; } // Construct the response message. String statusLine = null; String contentTypeLine = null; String entityBody = null; if (fileExists) { statusLine = "200 OK:"; contentTypeLine = "Content-Type: " + contentType( fileName ) + CRLF; } else { statusLine = "HTTP/1.1 404 Not Found:"; contentTypeLine = "Content-Type: text/html"+ CRLF; entityBody = "" + "Not Found" + "Not Found"; } // Send the status line. os.writeBytes(statusLine); // Send the content type line. os.writeBytes(contentTypeLine); // Send a blank line to indicate the end of the header lines. os.writeBytes(CRLF); // Send the entity body. if (fileExists) { sendBytes(fis, os); fis.close(); } else { os.writeBytes(entityBody); } os.writeBytes(entityBody); DataOutputStream outToClient = new DataOutputStream(socket.getOutputStream()); outToClient.writeBytes("HTTP/1.1 200 OK"); outToClient.writeBytes("Content-Length: 100"); outToClient.writeBytes("Content-Type: text/html\n\n"); outToClient.writeBytes(" My First Heading My first paragraph.\n"); outToClient.close(); // Close streams and socket. os.close(); br.close(); socket.close(); } private static String contentType(String fileName) { if(fileName.endsWith(".html") || fileName.endsWith(".html")) { return "text/html"; } return "application/octet-stream"; } private static void sendBytes(FileInputStream fis, OutputStream os) throws Exception { // Construct a 1K buffer to hold bytes on their way to the socket. byte[] buffer = new byte[1024]; int bytes = 0; // Copy requested file into the socket�s output stream. while ((bytes = fis.read(buffer)) != -1) { os.write(buffer, 0, bytes); } } }