java实现简单web服务器

该程序简单实现web服务器,目前仅支持html和gif/jpeg格式,下面是代码:


import java.io.* ;
import java.net.* ;
import java.util.* ;

public class SimpleWebServer {
    
    public static void main(String argv[]) throws Exception {
        //Get the port as an argument.

        // Also, you could hard code the port to point to 6789 or any other port

        int port = (new Integer(argv[0])).intValue();
        
        // Establish the listen socket.

        ServerSocket socket = new ServerSocket(port);
        while(true){
            // Listen for a TCP connection request.

            Socket connection = socket.accept();    
            processRequest(connection);
        }
    }
    
    private static void processRequest(Socket connection) throws Exception {     
        
        final String CRLF = "\r\n";
        Socket socket = connection;
        
        // Get a reference to the socket's input and output streams.

        InputStream is = socket.getInputStream();
        DataOutputStream os = new DataOutputStream(socket.getOutputStream());
        
        // Set up input stream filters.

        BufferedReader br = new BufferedReader(new InputStreamReader(is));
        
        // Get the request line of the HTTP request message.

        String requestLine = br.readLine();
        
        // Extract the filename from the request line.

        StringTokenizer tokens = new StringTokenizer(requestLine);
        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 = "/root/" + fileName ;
        
        // Open the requested file.

        FileInputStream fis = null ;
        boolean fileExists = true ;
        try {
            fis = new FileInputStream(fileName);
        } catch (FileNotFoundException e) {
            fileExists = false ;
        }
        
        // Construct the response message.

        String statusLine = null;
        String contentTypeLine = null;
        String entityBody = null;
        if (fileExists) {
            statusLine = "HTTP/1.0 200 OK" + CRLF;
            contentTypeLine = "Content-Type: " +
                contentType(fileName) + CRLF;
        } else {
            statusLine = "HTTP/1.0 404 Not Found" + CRLF;
            contentTypeLine = "Content-Type: text/html" + CRLF;
            entityBody = "<HTML>" +
                "<HEAD><TITLE>Not Found</TITLE></HEAD>" +
                "<BODY>Not Found</BODY></HTML>";
        }
        // 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 {
            fileExists = false;
            os.writeBytes(entityBody) ;
        }
        
        // Close streams and socket.

        os.close();
        br.close();
        socket.close();
    }
    
    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);
        }
    }
    
    private static String contentType(String fileName) {
        if(fileName.endsWith(".htm") || fileName.endsWith(".html")) {
            return "text/html";
        }
        
        else if (fileName.endsWith(".gif")) {
            return "image/gif";
        }
        
        else if (fileName.endsWith(".jpg") || fileName.endsWith(".jpeg")){
            return "image/jpeg";
        }     
        return "application/octet-stream" ;
    }
}


作者: reesun   发布时间: 2010-10-19