У меня есть игровой сервер 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 мс перед каждой отправкой без необходимости переписывать все это? Я немного погуглил, но не могу найти ничего, что касается этой проблемы. Буду очень признателен за любые советы или информацию, которые помогут в этом, ведь оптимизация скорости очень важна. Спасибо.