Я внедряю 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);
}
}