Examples

웹 서버 예제

알 수 없는 사용자 2008. 4. 28. 22:50

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

public final class WebServer {
 public static void main(String[] args) {
  int port = 6789;
 
  try {
   ServerSocket ss = new ServerSocket(port);
   while (true) {
    Socket socket = ss.accept();
   
    HttpRequest request = new HttpRequest(socket);
   
    Thread thread = new Thread(request);
   
    thread.start();
   }
  } catch (IOException e) {
   System.err.println(e);
  }
 }
}

final class HttpRequest implements Runnable {
 final static String CRLF = "\r\n";
 Socket socket;
 
 public HttpRequest(Socket socket) {
  this.socket = socket;
 }
 
 public void run() {
  try {
   processRequest();
  } catch (Exception e) {
   System.err.println(e);
  }
 }
 
 private void processRequest() throws Exception {
  InputStream is = socket.getInputStream();
  DataOutputStream os = new DataOutputStream(socket.getOutputStream());
 
  InputStreamReader isr = new InputStreamReader(is);
  BufferedReader br = new BufferedReader(isr);
 
  String requestLine = br.readLine();
 
  StringTokenizer tokens = new StringTokenizer(requestLine);
  tokens.nextToken();
  String fileName = tokens.nextToken();
 
  fileName = "." + fileName;
 
  FileInputStream fis = null;
  boolean fileExists = true;
  try {
   fis = new FileInputStream(fileName);
  } catch (FileNotFoundException e) {
   fileExists = false;
  }
 
  String statusLine = null;
  String contentTypeLine = null;
  String entityBody = null;
  if (fileExists) {
   statusLine = "HTTP/1.1 200 OK" + CRLF;
   contentTypeLine = "Content-type: " +
     contentType(fileName) + CRLF;
  } else {
   statusLine = "HTTP/1.1 404 Not Found" + CRLF;
   contentTypeLine = "Content-type: text/html" + CRLF;
   entityBody = "<HTML>" +
     "<HEAD><TITLE>Not Found</TITLE></HEAD>" +
     "<BODY>Not Found</BODY></HTML>";
  }
 
  os.writeBytes(statusLine);
 
  os.writeBytes(contentTypeLine);
 
  os.writeBytes(CRLF);
 
  if (fileExists) {
   sendBytes(fis, os);
   fis.close();
  } else {
   os.writeBytes(entityBody);
  }
 
  System.out.println();
  System.out.println(requestLine);
 
  String headerLine = null;
  while ((headerLine = br.readLine()).length() != 0) {
   System.out.println(headerLine);
  }
 
  os.close();
  br.close();
  socket.close();
 }
 
 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) {
  fileName = fileName.toLowerCase();
 
  if (fileName.endsWith(".htm") || fileName.endsWith(".html")) {
   return "text/html";
  }
  if (fileName.endsWith(".gif")) {
   return "image/gif";
  }
  if (fileName.endsWith(".jpg")) {
   return "image/jpeg";
  }
 
  return "application/octet-stream";
 }
}