Как сохранить контекст сокета в Vert.x TCP - PullRequest
0 голосов
/ 31 марта 2020

Я внедряю TCP-сервер, используя Vert.x NetServer, пример кода следующий. Поток TCP представляет собой кадр различного размера, первые 4 байта указывают длину кадра. Как вы знаете, иногда буфер может включать в себя несколько кадров, иногда буфер включает часть кадра вместо полного кадра, поэтому я должен использовать переменную inBuffer для хранения входящего буфера, а затем проверить, включает ли inBuffer кадр, если да , затем go вперед, в противном случае, затем продолжить чтение следующего буфера. Этот лог c абсолютно корректен.

Проблема заключается в том, что в обработчике Vert.x для каждого соединения с сокетом должно быть свой inBuffer, в этом примере кода inBuffer будет общим для всех соединений, это не является правильным. Но в "socket.handler" каждое соединение с сокетом не имеет контекста, я не могу объявить специфицированный c буфер для каждого сокета.

Если я объявляю hashMap для хранения, функциональность в порядке, но Получив пакет из сокета, мне нужно посмотреть hashMap, чтобы получить его inBuffer. Я думаю, что производительность будет очень плохой, потому что для каждого пакета нужно искать hashMap. вопрос - как сохранить контекст для каждого сокета? В этом контексте я могу хранить inBuffer et c. Хотя hashMap работает, но производительность не приемлема.

Пожалуйста, поделитесь своим опытом или идеями, большое спасибо.

public class VertxTcpServerVerticle extends AbstractVerticle {

    private Buffer inBuffer = null;

    public VertxTcpServerVerticle()
    {
        inBuffer = Buffer.buffer();
    }

    @Override
    public void start() throws Exception {
        NetServer server = vertx.createNetServer();

        server.connectHandler(new Handler<NetSocket>() {

            @Override
            public void handle(NetSocket socket) {
                System.out.println("Incoming connection!");

                socket.handler(buffer -> {

                    if (buffer == null || buffer.length() == 0) {
                        return;
                    }

                    inBuffer.appendBuffer(buffer);

                    int frameSize = inBuffer.getInt(0);
                    if(inBuffer.length() < frameSize)
                    {
                        // continue to read buffer until frame is complete
                        return;
                    }

                    doSomething();

                });
            }
        });

        server.listen(10000);
    }
}
...