Vertx NetServer контролирует поток чтения - PullRequest
0 голосов
/ 02 июля 2018

Я пытаюсь имитировать TCP-сервер для тестов с Vertx на основе существующей инфраструктуры, с которой мне приходится работать.

Сервер, который я имитирую, работает полностью асинхронно и знает длину входящего буфера, основываясь на предварительном заголовке в буфере, который указывает длину запроса.

Мне нужно прочитать первые 6 символов входящего запроса на каждом клиентском сокете, который подключается к моему фиктивному TCP-серверу. Из этого предварительного заголовка я читаю фактическую длину запроса (например, для xx3018, я знаю, что полная длина запроса - 3018).

Затем мне нужно прочитать остаток буфера в соответствии с длиной, сопоставить его с картой ответов и вернуть правильный ответ для запроса.

Пример рабочего макета сервера с простым Java (быстрое внедрение, поэтому другие разработки не будут блокироваться :))

public void run(String... args) throws Exception {
    log.info("Starting TCP Server");

    ServerSocket serverSocket = new ServerSocket(1750);

    while (true) {
        try {
            Socket socket = serverSocket.accept();

            CompletableFuture.runAsync(() -> {
                Exception e = null;
                while (e == null) {
                    try {
                        InputStream inputStream = socket.getInputStream();
                        OutputStream outputStream = socket.getOutputStream();

                        byte[] preHeader = new byte[6];
                        inputStream.read(preHeader);

                        String preHeaderValue = new String(preHeader);
                        log.info("Pre header: {}", preHeaderValue);

                        int length = Integer.valueOf(preHeaderValue.substring(2));
                        log.info("Request full length: {}", length);
                        byte[] request = new byte[length - 6];

                        inputStream.read(request);

                        String requestValue = new String(request);

                        log.info("Request: {}", requestValue);

                        String response = this.requestResponseProvider.getResponse(preHeaderValue + requestValue);
                        log.info("Response: {}", response);
                        outputStream.write(response.getBytes());
                    } catch (Exception ex) {
                        log.error("Encountered a problem: {}", e.getMessage());
                        e = ex;
                    }
                }
            });
        } catch (Exception e) {
            log.error("Encountered a problem: {}", e.getMessage());
        }
    }
}

Кажется, я не могу найти способ управления входным потоком так же, как я управляю им с помощью простого Java.

...