/** * Code based on code from Computer Networking: A Top-Down Approach Featuring * the Internet. J.F Kurose and K.W. Ross. Extended to multi-threads * **/ import java.io.*; import java.net.*; import java.util.*; class RequestServer extends Thread { Socket connSocket; public RequestServer( Socket connectionSocket ) { connSocket = connectionSocket; } public void run () { try { // read the request from client BufferedReader inFromClient = new BufferedReader(new InputStreamReader(connSocket.getInputStream())); String requestMessageLine; requestMessageLine = inFromClient.readLine(); // process the request StringTokenizer tokenizedLine = new StringTokenizer(requestMessageLine); if (tokenizedLine.nextToken().equals("GET")) { String fileName; // parse URL to retrieve file name fileName = tokenizedLine.nextToken(); if (fileName.startsWith("/") == true ) fileName = fileName.substring(1); File file = new File(fileName); int numOfBytes = (int) file.length(); FileInputStream inFile = new FileInputStream (fileName); byte[] fileInBytes = new byte[numOfBytes]; inFile.read(fileInBytes); // get output stream DataOutputStream outToClient = new DataOutputStream(connSocket.getOutputStream()); // generate response header outToClient.writeBytes("HTTP/1.0 200 Document Follows\r\n"); if (fileName.endsWith(".jpg")) outToClient.writeBytes("Content-Type: image/jpeg\r\n"); if (fileName.endsWith(".gif")) outToClient.writeBytes("Content-Type: image/gif\r\n"); outToClient.writeBytes("Content-Length: " + numOfBytes + "\r\n"); outToClient.writeBytes("\r\n"); // send file content outToClient.write(fileInBytes, 0, numOfBytes); // close connection connSocket.close(); } // end of if else System.out.println("Bad Request Message"); } // end of try catch (Exception e) { System.out.println("Error"); } // end of catch } // end of run() } // end of RequestServer class mtHTTPServer { public static void main(String args[]) throws Exception { // see if we do not use default server port int serverPort = 6789; if (args.length >= 1) serverPort = Integer.parseInt(args[0]); // create server socket ServerSocket listenSocket = new ServerSocket(serverPort); System.out.println("server listening at " + listenSocket); while (true) { // take a ready connection from the accepted queue Socket connectionSocket = listenSocket.accept(); System.out.println("receive request from " + connectionSocket); // dispatch a request server Thread t = new RequestServer( connectionSocket ); t.start(); } // end of while (true) } // end of main } // end of mtHTTPServer