Создайте постоянный 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, и я хотел бы сохранить его в активном состоянии, а не строить его снова в новой теме. Также я думаю, что проще реализовать кнопку "Отмена" внутри одного потока.
Я надеюсь, что смогу прояснить, что я хочу и где моя проблема:)