/** * */ package iotest.serversocket; import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.ByteArrayOutputStream; import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.io.OutputStream; import java.io.UnsupportedEncodingException; import java.net.ServerSocket; import java.net.Socket; /** * @author Brandon B. Lin * */ public class SingleFileHttpServer extends Thread { private byte[] content; private byte[] header; private int port = 80; public SingleFileHttpServer(String data, String encoding, String MIMEType, int port) throws UnsupportedEncodingException { this(data.getBytes(encoding), encoding, MIMEType, port); } public SingleFileHttpServer(byte[] data, String encoding, String MIMEType, int port) throws UnsupportedEncodingException { this.content = data; this.port = port; createHeader(encoding, MIMEType); } private void createHeader(String encoding, String MIMEType) throws UnsupportedEncodingException { String header = "HTTP/1.0 200 OK\r\n" + " Server: OneFIle 1.0\r\n" + "Content-length: " + content.length + "\r\n" + "Content-type: " + MIMEType + "\r\n\r\n"; this.header = header.getBytes(encoding); } @Override public void run() { try { ServerSocket server = new ServerSocket(port); log(server.getLocalPort()); while (true) { respond(server); } } catch (IOException exception) { System.err.println("Could not start server. Port Occupied!"); } } private void log(int port) { System.out.println("Accepting connection on port " + port); System.out.println("Data to be sent: "); try { System.out.write(content); } catch (IOException e) { e.printStackTrace(); } } private void respond(ServerSocket server) { Socket connection = null; try { connection = server.accept(); String request = readRequestFromSocket(connection); boolean writeHeader = (request.toString().indexOf("HTTP/") != -1); writeToSocket(connection, writeHeader); } catch (IOException e) { e.printStackTrace(); } finally { if (connection != null) try { connection.close(); } catch (IOException e) { e.printStackTrace(); } } } |