2.1 Разработка игрового веб-сервера на Java. Быстрый старт с Jetty сервером

Класс Main является главным. Точка входа приложения - метод main() класса Main. В функции simpleServer() создается базовый Jetty сервер которому передается в качестве обработчика пользовательский класс - JettyServer. Далее сервер запускается в отдельном потоке (метод start()), а текущий поток останавливается до окончания потока сервера (это достигается вызовом метода join()).

Альтернативная функция для запуска сервера withStaticServer() отдает статический контент - файл index.html.

src/main/Main.java

package main;

import org.eclipse.jetty.server.Handler;
import org.eclipse.jetty.server.Server;
import org.eclipse.jetty.server.handler.HandlerList;
import org.eclipse.jetty.server.handler.ResourceHandler;
import org.eclipse.jetty.server.nio.SelectChannelConnector;

public class Main {

    public static void main(String[] args) throws Exception {
        simpleServer();
    }
    
    private static void simpleServer() throws Exception, InterruptedException {
        Server server = new Server(8080);
        server.setHandler(new JettyServer());
        
        server.start();
        server.join();
    }
    
    private static void withStaticServer() throws Exception, InterruptedException {
        Server server = new Server();
        
        SelectChannelConnector connector = new SelectChannelConnector();
        connector.setPort(8080);
        server.addConnector(connector);
 
        ResourceHandler resource_handler = new ResourceHandler();
        resource_handler.setDirectoriesListed(true);
        resource_handler.setWelcomeFiles(new String[]{ "index.html" });
 
        resource_handler.setResourceBase(".");
 
        HandlerList handlers = new HandlerList();
        handlers.setHandlers(new Handler[] { resource_handler, new JettyServer() });
        server.setHandler(handlers);
 
        server.start();
        server.join();
    }
    

}


В классе JettyServer метод handle() вызывается каждый раз при обращении к серверу. У Jetty есть пул потоков, из которого берется поток и в нем происходит выполнение метода handle().

src/main/JettyServer.java

package main;

import html.HTMLPage;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.eclipse.jetty.server.Request;
import org.eclipse.jetty.server.handler.AbstractHandler;

public class JettyServer extends AbstractHandler
{
    public void handle(String target,
                       Request baseRequest,
                       HttpServletRequest request,
                       HttpServletResponse response) 
        throws IOException, ServletException
    {
        response.setContentType("text/html;charset=utf-8");
        response.setStatus(HttpServletResponse.SC_OK);
        baseRequest.setHandled(true);
        response.getWriter().println(HTMLPage.getPage());
       
    }
}


Метод getPage() класса HTMLPage возвращает HTML страницу которую Jetty сервер вернет пользователю.

src/html/HTMLPage.java

package html;

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;

public class HTMLPage {
    private static final int refreshTime = 1000;

    private static String pagePart0 = "<html>" +
    "<head>" +
    "<script type='text/JavaScript'>" +
    "function setClientTime(){" +
        "currentTime = new Date();" +
        "hours = currentTime.getHours();" +
        "minutes = currentTime.getMinutes();" +
        "seconds = currentTime.getSeconds();" +
        "if (minutes < 10)" +
            "minutes = '0' + minutes;" +
        "if (seconds < 10)" +
            "seconds = '0' + seconds;" +
        "timeString = hours + ':' + minutes + ':' + seconds;" +
        "document.getElementById('ClientTime').innerHTML = timeString;" +
    "}" +
    "function refresh(){" +
        "location.reload(true);" +
    "}" +
    "</script>" +
    "</head>" +
    "<body onload='setInterval(function(){refresh()},"+ refreshTime +"); setClientTime();'>" +
    "<p>Client time: <span id='ClientTime'></span></p>" +
    "<p>Server time: ";
    
    private static String pagePart1 = "</p>" +
    "</body>" +
    "</html>";
    
        
    public static String getTime(){
        Date date = new Date();
        date.getTime();
        DateFormat formatter = new SimpleDateFormat("HH.mm.ss");
        return formatter.format(date);
    }
    
    public static String getPage(){
        return pagePart0 + getTime() + pagePart1;
    }
}


--
https://github.com/vitaly-chibrikov/tp_java_2013_02/tree/master/lecture1