package se.sics.gvod.ls.http;
import com.sun.net.httpserver.HttpServer;
import java.io.IOException;
import java.net.BindException;
import java.net.InetSocketAddress;
import java.net.URL;
import java.util.logging.Level;
import java.util.logging.Logger;
import org.slf4j.LoggerFactory;
import se.sics.gvod.ls.system.LSConfig;
import se.sics.gvod.video.msgs.Piece;
import se.sics.gvod.video.msgs.SubPiece;
/**
* Reads Pieces and provides their data content through a HTTP stream.
*
* @author Niklas Wahlén <nwahlen@kth.se>
*/
public class HTTPStreamingServer {
private final org.slf4j.Logger logger = LoggerFactory.getLogger(HTTPStreamingServer.class);
private HTTPRequestHandler handler;
private HttpServer server;
public HTTPStreamingServer(InetSocketAddress serverAddress) throws IOException {
handler = new HTTPRequestHandler();
try {
server = HttpServer.create(serverAddress, 0);
server.createContext("/", handler);
server.setExecutor(null);
server.start();
logger.info("Server started on "
+ server.getAddress().getAddress().getHostAddress()
+ ":" + server.getAddress().getPort());
} catch (BindException be) {
if(LSConfig.isSimulation()) {
logger.error("Couldn't start server: " + be.getMessage() + " (OK during simulation)");
} else {
throw be;
}
}
}
public void deliver(Piece piece) throws IOException {
for(SubPiece sp : piece.getSubPieces())
handler.deliver(sp);
}
public void deliver(SubPiece sp) throws IOException {
handler.deliver(sp);
}
public void stop() {
if (server != null) {
try {
handler.stop();
} catch (IOException ex) {
Logger.getLogger(HTTPStreamingServer.class.getName()).log(Level.SEVERE, null, ex);
}
server.stop(0);
logger.debug("Server stopped");
}
}
public static void main(String args[]) {
try {
HTTPStreamingServer streamingServer = new HTTPStreamingServer(new InetSocketAddress(8081));
HTTPStreamingClient inStream = new HTTPStreamingClient(new URL("http://127.0.0.1:8080"));
// HTTPStreamingClient inStream = new HTTPStreamingClient("http://sverigesradio.se/topsy/direkt/164-mp3.asx");
// HTTPStreamingClient inStream = new HTTPStreamingClient(new File("source.mp4"));
System.out.println("HTTP Server waiting for request");
new Thread(inStream).start();
while (!inStream.isReading() || inStream.hasNextPiece()) {
if (inStream.hasNextPiece()) {
Piece p = inStream.getNextPiece();
System.out.println("HTTP Server: new Piece " + p.getId());
try {
Thread.sleep(200);
} catch (InterruptedException ex) {
Logger.getLogger(HTTPStreamingServer.class.getName()).log(Level.SEVERE, null, ex);
}
streamingServer.deliver(p);
}
}
streamingServer.stop();
} catch (IOException ex) {
Logger.getLogger(HTTPStreamingServer.class.getName()).log(Level.SEVERE, null, ex);
}
}
}