954,518 Members — Technology Publication meets Social Media
Username:
Password:
Lost login information?

Basic Web Server

0
By Sean Burgess Pedersen on Dec 14th, 2010 2:38 pm

The server only does the basics.
TODOs:
The header method needs expanding. The file send method can't handle too large files. Maybe write custom buffer class since some buffering is done. Keep cache of recent files.

public class WebServer {

    public static String version = "Java Web Server 0.0";

    public static void main(String[] args) {
        try {
            ServerSocket ss = new ServerSocket(8080);
            System.out.println(version);
            while (ss.isBound()) new Thread(new Client(ss.accept())).start();
        } 
        catch (IOException e) { e.printStackTrace(); }
    }

}


class Client implements Runnable {

    private static final String userdir = System.getProperty("user.dir");
    static final byte[] EOL = {(byte) '\r', (byte) '\n'};
    private Socket accept;
    private InputStream is;
    private PrintStream os;

    private enum Method {

        GET,
        HEAD,
        UNSUPPORTED;
    }

    public Client(Socket accept) {
        this.accept = accept;
    }

    public void run() {
        try {

            // variables
            is = new BufferedInputStream(accept.getInputStream());
            os = new PrintStream(accept.getOutputStream());
            int character;
            String req = "";
            String[] request;
            Method method;
            File file;

            // store first line of request header
            character = is.read();
            while (character != '\n' && character != '\r') {
                req += (char) character;
                character = is.read();
            }
            System.out.println(req);
            request = req.split(" ");

            // store method
            if (request[0].matches("GET")) {
                method = Method.GET;
            } else if (request[0].matches("HEAD")) {
                method = Method.HEAD;
            } else {
                method = Method.UNSUPPORTED;
            }

            // logic!
            request[1] = request[1].replace("/", File.separator);
            file = new File(userdir + File.separator + request[1]);
            if (file.exists() && !file.isHidden()) {
                if (method == Method.GET || method == Method.HEAD) {
                    writeHeader(file, 200);
                    if (method == Method.GET) {
                        if (file.isFile()) {
                            sendFile(file);
                        } else if (file.isDirectory()) {
                            listDir(request[1], file);
                        }
                    }
                } else {
                    writeHeader(file, 501);
                }
            } else {
                writeHeader(file, 404);
            }

        } catch (IOException ex) {
            ex.printStackTrace();
        } finally {
            try {
                accept.close();
            } catch (IOException ex) {
                System.exit(1);
            }
        }
    }

    private void sendFile(File file) throws FileNotFoundException, IOException {
        int bufferlen = (int) file.length();
        byte buffer[];
        buffer = new byte[bufferlen];
        InputStream fs = new FileInputStream(file);
        int len = fs.read(buffer);
        while (len < bufferlen) {
            len += fs.read(buffer, len, bufferlen - len);
        }
        os.write(buffer);
        os.flush();
    }

    private void listDir(String currentDir, File dir) {
        currentDir = currentDir.replace(File.separator, "/");
        String listing[] = dir.list();
        if (!currentDir.endsWith("/")) {
            currentDir += "/";
        }
        os.println(WebServer.version + "<br>");
        for (String item : listing) {
            os.println("<a href=\"" + currentDir + item + "\">" + item + "</a><br>");
        }
        os.flush();
    }

    private void writeHeader(File f, int code) throws IOException {
        String fname = f.getName();
        os.print("HTTP/1.0 ");

        switch (code) {
            case 200:
                os.print("200 OK");
                break;
            case 400:
                os.print("400 Bad Request");
                break;
            case 404:
                os.print("404 Not Found");
                break;
            case 501:
                os.print("501 Not Implemented");
                break;
        }
        os.write(EOL);

        if (code == 200) {
            os.print("Content-Type: ");
            if (fname.endsWith("html") || fname.endsWith("htm")) {
                os.print("text/html");
            } else if (fname.endsWith("java")) {
                os.print("text/plain");
            } else if (fname.endsWith("jpeg") || fname.endsWith("jpg")) {
                os.print("image/gif");
            } else {
                os.print("text/html");
            }
            os.write(EOL);
        }

        os.write(EOL);
        os.flush();
    }
}

ahmmm, what are the libraries that to be imported in this project....?

bords
Light Poster
35 posts since Oct 2009
Reputation Points: 11
Solved Threads: 1
 
import java.io.*;
import java.net.*;
seanbp
Junior Poster
129 posts since Jul 2010
Reputation Points: 20
Solved Threads: 15
 

This article has been dead for over three months

Post: Markdown Syntax: Formatting Help
You
View similar articles that have also been tagged: