Как реализовать Шейпер трафика

82
01 марта 2021, 20:40

Есть сокеты на Java. Все данные передаются в виде объектов(хотел как проще, а вышло как обычно)

outputStream.writeObject(new Ping());

Есть задача реализовать шейпер(или подобное).
Как я вижу работу шейпера:

long x = System.nanoTime();
long BytesWrite = outputStream.writeObject(new Ping());
while((BytesWrite / (System.nanoTime() - x))>1000)
{
  sleep(1);
}

Проблема в получении BytesWrite
Решаема ли она при текущем подходе?(и как?)
Есть ли смысл отказываться от такой модели и городить "свой" формат пакетов и их отправки?
Есть ли в Java что то встроенное для подобных извращений(шейпинг трафика)?

Answer 1

Нужно создавать ObjectOutputStream каждый раз когда передаете объект. В качестве базового потока использовать ByteArrayOutputStream (тоже каждый раз новый). Вытаскивать из него массив байт и передавать его в реальный поток.

PS: Ваш текущий код приведет к утечке памяти так как ObjectOutputStream запоминает все отправленные объекты.

PPS: Стандартная сериализация ужасна, постарайтесь избегать ее.

READ ALSO
Как перевести \n в строку

Как перевести \n в строку

Как мне перевести \n в строку? Если я пишу :

98
Проблема при запуске программы в режиме Debug

Проблема при запуске программы в режиме Debug

Запускаю программу в режиме отладкиПрограмма выполняется, но в консоли надпись красным цветом:

119
Error: could not open `C:\Program Files\Java\jre1.8.0_212\lib\amd64\jvm.cfg'

Error: could not open `C:\Program Files\Java\jre1.8.0_212\lib\amd64\jvm.cfg'

Устанавливал jdk 12 и 8, потом удалил 8, но система запомнила только путь к 8

137
Как проверить ввод пользователя по всем регистрам?

Как проверить ввод пользователя по всем регистрам?

Мне нужно что бы ввод пользователя переходил в нижний регистр, тем самым если его спросят: "Выйти?(y/n): " и он ответит - "Y" те большими буквами,...

98