Мой интернет-провайдер заставляет меня буферизовать данные TCP перед их отправкой

У меня есть игровой сервер Java TCP, я использую java.net.ServerSocket и все работает нормально, но недавно мой интернет-провайдер сделал своего рода обновление, где, если вы очень быстро отправляете два пакета для одного и того же TCP-соединения, они принудительно закрывают его.

Вот почему многие мои игроки случайным образом отключаются, когда в игре много трафика (когда есть большая вероятность, что сервер отправит 2 пакета одновременно для одного и того же человека)

Вот пример того, что я имею в виду: Если я сделаю что-то подобное, мой интернет-провайдер без всякой причины закроет соединение как на стороне клиента, так и на стороне сервера:

tcpOut.print("Hello.");
tcpOut.flush();

tcpOut.print("How are you?");
tcpOut.flush();

Но все будет нормально, если я сделаю что-то вроде этого:

tcpOut.print("Hello.");
tcpOut.flush();

Thread.sleep(200);

tcpOut.print("How are you?");
tcpOut.flush();

Или вот так:

tcpOut.print("Hello.");
tcpOut.print("How are you?");
tcpOut.flush();

Это только началось пару недель назад, когда они (провайдер) внесли некоторые изменения в сервис и сеть. Используя Wireshark, я заметил, что у вас должно быть время не менее ~ 150 мс между двумя пакетами для одного и того же TCP-соединения, иначе оно закроется.

1) Ребята, вы знаете, как это называется? у него вообще есть название? Это законно?

Теперь мне нужно переписать свой игровой сервер, зная, что я использую метод с именем: send(PrintWriter out, String packetData);

2)Есть ли какое-либо простое решение, позволяющее попросить java буферизовать данные перед их отправкой клиентам? Или ждать 150 мс перед каждой отправкой без необходимости переписывать все это? Я немного погуглил, но не могу найти ничего, что касается этой проблемы. Буду очень признателен за любые советы или информацию, которые помогут в этом, ведь оптимизация скорости очень важна. Спасибо.

12
задан Igor Popov 24 February 2015 в 08:25
поделиться