Szakkörök‎ > ‎Algoritmus szakkör‎ > ‎2014-2015‎ > ‎

26. alkalom

A NanoHttpd webszerverre alapozva elkezdtünk (egész pontosan Hornák Bence elkezdte) megírni egy "egyszámjáték" szervert. Első alkalommal a következő metódusok készültek el:
  • clear: tippek törlése, új játék indítása
  • finish: játék lezárása (már nem lehet új tippet küldeni, de még tárolja a beküldött számokat)
  • winner: megadja, hogy melyik szám nyert / még nincs teljesen kész, okosítani kell /
  • send: tipp beküldése

A szerverünk memóriában tárolja az állapotokat, és pillanatnyilag nem végez beléptetést / jogosultság ellenőrzést. A terv az, hogy jövő héten kiegészítjük felhasználói azonosítással, és valamilyen egyszerű webes klienssel.

Egy picit beszéltünk a TCP/IP protokoll-családról és a HTTP protokollról is.

Készülőben lévő kód:

package hu.berzsenyi.hb;

import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

import fi.iki.elonen.NanoHTTPD;
import fi.iki.elonen.NanoHTTPD.IHTTPSession;
import fi.iki.elonen.NanoHTTPD.Response;
import fi.iki.elonen.NanoHTTPD.Response.Status;

public class OneNumberGame extends NanoHTTPD {

    private final Boolean ONE = true, MORE = false;

    private Map<Integer, Boolean> numbers = new HashMap<Integer, Boolean>();
    private boolean running = true;

    public OneNumberGame() {
        super(80);
    }

    @Override
    public Response serve(IHTTPSession session) {
        String uri = session.getUri();

        if (uri.equals("/send"))
            return send(session.getParms());
        else if (uri.equals("/finish"))
            return finish();
        else if (uri.equals("/winner"))
            return winner();
        else if (uri.equals("/clear"))
            return clear();

        return new Response(Status.NOT_FOUND, MIME_PLAINTEXT,
            "Command not found");
    }

    private Response send(Map<String, String> parms) {
        if (!running)
            return new Response(Status.BAD_REQUEST, MIME_PLAINTEXT,
                "The game is not started");
        if (!parms.containsKey("number"))
            return new Response(Status.METHOD_NOT_ALLOWED, MIME_PLAINTEXT,
                "Please specify the number");
        try {
            int number = Integer.parseInt(parms.get("number"));
            if (number <= 0)
                return new Response(Status.BAD_REQUEST, MIME_PLAINTEXT,
                    "Number should be positive");

            Boolean status = numbers.get(Integer.valueOf(number));
            if (status == ONE)
                numbers.put(Integer.valueOf(number), MORE);
            else if (status == null)
                numbers.put(Integer.valueOf(number), ONE);

            return new Response(Status.OK, MIME_PLAINTEXT, "Success");

        } catch (NumberFormatException e) {
            return new Response(Status.BAD_REQUEST, MIME_PLAINTEXT,
                "Number should be an integer");
        }
    }

    private Response finish() {
        if (!running)
            return new Response(Status.METHOD_NOT_ALLOWED, MIME_PLAINTEXT,
                "The game is not running");
        running = false;
        return new Response(Status.OK, MIME_PLAINTEXT,
            "The game has been finished :)");
    }

    private Response winner() {
        if (running)
            return new Response(Status.METHOD_NOT_ALLOWED, MIME_PLAINTEXT,
                "The game is running yet");
        int number =Integer.MAX_VALUE;
        for (Integer i : numbers.keySet())
            if (i < number && numbers.get(i) == ONE)
                number = i;
        if (number == Integer.MAX_VALUE)
            return new Response(Status.OK, MIME_PLAINTEXT, "There is no winner.");
        return new Response(Status.OK, MIME_PLAINTEXT, "The winner number is: "
            + number);
    }

    private Response clear() {
        numbers.clear();
        return new Response(Status.OK, MIME_PLAINTEXT,
            "A new game has been started :)");
    }

    public static void main(String[] args) {
        OneNumberGame server = new OneNumberGame();
        try {
            server.start();
        } catch (IOException ioe) {
            System.err.println("Couldn't start server:\n" + ioe);
            System.exit(-1);
        }

        System.out.println("Server started, Hit Enter to stop.\n");

        try {
            System.in.read();
        } catch (Throwable ignored) {
        }

        server.stop();
        System.out.println("Server stopped.\n");
    }
}