writing small http server in Java/C++

Status
Not open for further replies.

#/bin/sh

Journeyman
//**************************************
//
// Name: HTTP SERVER
// Description:This is a Fully fledged H
//This code came directly from "JAVA
//Network Programming" by Elliotte Rusty
//Harold.....
//

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


public class jhttp extends Thread {
Socket theConnection;
static File docroot;
static String indexfile = "index.html";



public jhttp(Socket s) {
theConnection = s;
}


public static void main(String[] args) {
int thePort;
ServerSocket ss;
// get the Document root

try {
docroot = new File(args[0]);
}


catch (Exception e) {
docroot = new File(".");
}


// set the port to listen on

try {
thePort = Integer.parseInt(args[1]);
if (thePort < 0 || thePort > 65535) thePort = 80;
}


catch (Exception e) {
thePort = 80;
}


try {
ss = new ServerSocket(thePort);
System.out.println("Accepting connections on port "
+ ss.getLocalPort());
System.out.println("Document Root:" + docroot);


while (true) {
jhttp j = new jhttp(ss.accept());
j.start();
}

}


catch (IOException e) {
System.err.println("Server aborted prematurely");
}


}


public void run() {

String method;
String ct;
String version = "";
File theFile;



try {
PrintStream os = new PrintStream(theConnection.getOutputStream());
DataInputStream is = new DataInputStream(theConnection.getInputStream());
String get = is.readLine();
StringTokenizer st = new StringTokenizer(get);
method = st.nextToken();


if (method.equals("GET")) {
String file = st.nextToken();
if (file.endsWith("/")) file += indexfile;
ct = guessContentTypeFromName(file);


if (st.hasMoreTokens()) {
version = st.nextToken();
}

// loop through the rest of the input li
// nes

while ((get = is.readLine()) != null) {
if (get.trim().equals("")) break;
}


try {
theFile = new File(docroot, file.substring(1,file.length()));
FileInputStream fis = new FileInputStream(theFile);
byte[] theData = new byte[(int) theFile.length()];
// need to check the number of bytes rea
// d here
fis.read(theData);
fis.close();
if (version.startsWith("HTTP/")) { // send a MIME header
os.print("HTTP/1.0 200 OK\r\n");
Date now = new Date();
os.print("Date: " + now + "\r\n");
os.print("Server: jhttp 1.0\r\n");
os.print("Content-length: " + theData.length + "\r\n");
os.print("Content-type: " + ct + "\r\n\r\n");
} // end try


// send the file
os.write(theData);
os.close();
} // end try

catch (IOException e) { // can't find the file
if (version.startsWith("HTTP/")) { // send a MIME header
os.print("HTTP/1.0 404 File Not Found\r\n");
Date now = new Date();
os.print("Date: " + now + "\r\n");
os.print("Server: jhttp 1.0\r\n");
os.print("Content-type: text/html" + "\r\n\r\n");
}

os.println("<HTML><HEAD><TITLE>File Not Found</TITLE></HEAD>");
os.println("<BODY><H1>HTTP Error 404: File Not Found</H1></BODY></HTML>");
os.close();
}

}

else { // method does not equal "GET"
if (version.startsWith("HTTP/")) { // send a MIME header
os.print("HTTP/1.0 501 Not Implemented\r\n");
Date now = new Date();
os.print("Date: " + now + "\r\n");
os.print("Server: jhttp 1.0\r\n");
os.print("Content-type: text/html" + "\r\n\r\n");
}

os.println("<HTML><HEAD><TITLE>Not Implemented</TITLE></HEAD>");
os.println("<BODY><H1>HTTP Error 501: Not Implemented</H1></BODY></HTML>");
os.close();
}

}


catch (IOException e) {

}


try {
theConnection.close();
}


catch (IOException e) {
}

}



public String guessContentTypeFromName(String name) {
if (name.endsWith(".html") || name.endsWith(".htm")) return "text/html";
else if (name.endsWith(".txt") || name.endsWith(".java")) return "text/plain";
else if (name.endsWith(".gif") ) return "image/gif";
else if (name.endsWith(".class") ) return "application/octet-stream";
else if (name.endsWith(".jpg") || name.endsWith(".jpeg")) return "image/jpeg";
else return "text/plain";
}

}
 
Status
Not open for further replies.
Top Bottom