Java da web server yazımı

Aşağıda %100 Java ile yazılmış basit bir web server uygulaması bulunuyor. İstediğimiz port üzerinden http protokolüne uygun yayın yapabiliyor, ilk parametre olarak bir port numarası verirsek bu port üzerinden yayın yapacaktır. Uygulama default olarak “c:/webServer/” altındaki dosyaları yayınlıyor (bunu değiştirebilirsiniz) eğer bu dizin altında aşağıdaki html i test.html adıyla kaydedersek “htp://localhost:1500/test.html” adresinden ulaşabiliriz.

    <html>
     <body>
      <a href="#">aaaaaaa</a> <br/>
      <b>Deneme</b>
     </body>
    </html>

Java kodu aşağıdaki gibidir.

    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("c:/webServer/"+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"
                  + "<br>  "
                  + "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";
        }
      }
    }
Dec 8th, 2008
No comments yet.

Leave a comment

XHTML: You can use these tags: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>