    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);
    		}
    	}
     
    }