Я пытаюсь имитировать 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.