Создайте постоянный HTTP-сервер с Java

Я должен написать сервер, который может запускать несколько потоков (по одному на клиента), и соединение в этих потоках должно быть постоянным, потому что клиент и сервер должны передавать более одной пары запрос / ответ. Все это должно происходить в Java, потому что все фоновое содержимое происходит в Java (или альтернативе, которая может вызывать функции Java). В качестве примера, что должно произойти:

Клиент подключается к серверу с идентификатором продукта внутри тела. Сервер создает новый поток, и в этом потоке java-функции выполняют некоторую работу (уже реализованную), чтобы выяснить все опции для этого продукта. Затем сервер отвечает клиенту списком этих параметров, а на клиентском веб-сайте их отображают, чтобы пользователь мог выбрать, какой он хочет. После этого Клиент должен снова отправить ответ на сервер, который обнаруживает, что это не новый клиент, и автоматически пересылает новую информацию (выбранные параметры) в старый и ожидающий поток (или поток получает ответ напрямую, когда это возможно). Сервер теперь выполняет некоторую фоновую работу и в конце отправляет ответ, если задача была успешной или нет. После этого соединение может быть закрыто, а нить должна быть закрыта. Я тоже пытался нарисовать это краской, так что это будет немного яснее:

Представление предполагаемой последовательности событий

Согласно учебному пособию я обнаружил, что создал этот сервер. Я использовал HttpServer и изменил Executor на newFixedThreadPool, так что у меня фактически есть несколько потоков.

public class Main {

public static void main(String[] args) throws IOException {
    HttpServer server = HttpServer.create(new InetSocketAddress(9000), 0);
    server.createContext("/test", new MyHandler());
    int numOfCores = Runtime.getRuntime().availableProcessors(); // Number of logical cores   
    server.setExecutor(java.util.concurrent.Executors.newFixedThreadPool(numOfCores );
    server.start();
    }

    static class MyHandler implements HttpHandler {
        public void handle(HttpExchange httpExchange) throws IOException {
            logger.trace("Start: " + System.currentTimeMillis());
            long threadId = Thread.currentThread().getId();
            logger.info("Threadid: " + threadId);


            // Here is the handling to receive the and store the value of the http body (InputstreamReader, BufferReader, ...)


            submittedID = "HH753"; // Pseoudo ID, returned from the handling above


            //Here would the function call (with submittedID as parameter) and as the return value, i get an Arraylist like the one below


            listOfOptions = "['123','456','789']"; // Pseudo Arraylist

            // Transform Arraylist to JSON and send it inside the body to the client
            String json = new Gson().toJson(listOfOptions);
            Headers headers = httpExchange.getResponseHeaders();
            headers.add("Access-Control-Allow-Origin", "*");
            headers.add("Access-Control-Allow-Headers", "Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With");
            headers.add("Access-Control-Allow-Methods", "GET,POST,PUT,DELETE,OPTIONS");
            httpExchange.sendResponseHeaders(200, json.toString().length());
            OutputStream os = httpExchange.getResponseBody();
            os.write(json.getBytes());

            // The server sends the information and the client get them. On the client side the user chooses what he want and send a new response with the selection as json in the body
            // But I don't know how to design the server, to handle this new request inside the same thread. 




            os.close();

        }
    }
}

Мой код доходит до того момента, когда клиент получил первый ответ от сервера, поэтому у него теперь есть возможные варианты. Но я не знаю, как подключиться к серверу (содержащему выбранные опции), чтобы "старый" поток продолжал (и как долго его переводить в спящий режим) -> atm он запускает новый поток. Причина, по которой было бы очень хорошо остаться в том же потоке, а не просто создать новый, заключается в том, что внутри java-функций уже установлено соединение с 3 Jumphost, и я хотел бы сохранить его в активном состоянии, а не строить его снова в новой теме. Также я думаю, что проще реализовать кнопку "Отмена" внутри одного потока.

Я надеюсь, что смогу прояснить, что я хочу и где моя проблема:)

0 ответов

Другие вопросы по тегам