001: import java.net.*; 002: import java.io.*; 003: import java.util.*; 004: 005: public class SingleFileHTTPServer extends Thread { 006: 007: private byte[] content; 008: private byte[] header; 009: private int port = 80; 010: 011: public SingleFileHTTPServer(String data, String encoding, 012: String MIMEType, int port) throws UnsupportedEncodingException { 013: this(data.getBytes(encoding), encoding, MIMEType, port); 014: } 015: 016: public SingleFileHTTPServer(byte[] data, String encoding, 017: String MIMEType, int port) throws UnsupportedEncodingException { 018: 019: this.content = data; 020: this.port = port; 021: String header = "HTTP/1.0 200 OK\r\n" 022: + "Server: OneFile 1.0\r\n" 023: + "Content-Length: " + this.content.length + "\r\n" 024: + "Content-Type: " + MIMEType + "\r\n\r\n"; 025: this.header = header.getBytes("ASCII"); 026: 027: } 028: 029: 030: public void run() { 031: 032: try { 033: ServerSocket server = new ServerSocket(this.port); 034: System.out.println("Accepting connections on port " 035: + server.getLocalPort()); 036: System.out.println("Data to be sent:"); 037: System.out.write(this.content); 038: while (true) { 039: 040: Socket connection = null; 041: try { 042: connection = server.accept(); 043: OutputStream out = new BufferedOutputStream( 044: connection.getOutputStream() 045: ); 046: InputStream in = new BufferedInputStream( 047: connection.getInputStream() 048: ); 049: // read the first line only; that's all we need 050: StringBuffer request = new StringBuffer(80); 051: while (true) { 052: int c = in.read(); 053: if (c == '\r' || c == '\n' || c == -1) break; 054: request.append((char) c); 055: // If this is HTTP/1.0 or later send a MIME header 056: 057: } 058: if (request.toString().indexOf("HTTP/") != -1) { 059: out.write(this.header); 060: } 061: out.write(this.content); 062: out.flush(); 063: } // end try 064: catch (IOException e) { 065: } 066: finally { 067: if (connection != null) connection.close(); 068: } 069: 070: } // end while 071: } // end try 072: catch (IOException e) { 073: System.err.println("Could not start server. Port Occupied"); 074: } 075: 076: } // end run 077: 078: 079: public static void main(String[] args) { 080: 081: try { 082: 083: String contentType = "text/plain"; 084: if (args[0].endsWith(".html") || args[0].endsWith(".htm")) { 085: contentType = "text/html"; 086: } 087: 088: InputStream in = new FileInputStream(args[0]); 089: ByteArrayOutputStream out = new ByteArrayOutputStream(); 090: int b; 091: while ((b = in.read()) != -1) out.write(b); 092: byte[] data = out.toByteArray(); 093: 094: // set the port to listen on 095: int port; 096: try { 097: port = Integer.parseInt(args[1]); 098: if (port < 1 || port > 65535) port = 80; 099: } 100: catch (Exception e) { 101: port = 80; 102: } 103: 104: String encoding = "ASCII"; 105: if (args.length >= 2) encoding = args[2]; 106: 107: Thread t = new SingleFileHTTPServer(data, encoding, 108: contentType, port); 109: t.start(); 110: 111: } 112: catch (ArrayIndexOutOfBoundsException e) { 113: System.out.println( 114: "Usage: java SingleFileHTTPServer filename port encoding"); 115: } 116: catch (Exception e) { 117: System.err.println(e); 118: } 119: 120: } 121: 122: }