저는 Java TCP 게임 서버를 가지고 있습니다. java.net.ServerSocket
을 사용합니다. 모든 것이 잘 돌아가지만, 최근에 ISP는 업그레이드를했습니다. 패킷은 동일한 TCP 연결에 대해 매우 빠르며 강제로 닫습니다.내 ISP가 나를 보내기 전에 TCP 데이터를 버퍼에 넣습니다.
이 게임에서 트래픽이 많이있을 때 내 많은 선수가 무작위로 연결되는 이유는
(서버가 같은 사람을 동시에 2 개 패킷을 보낼 것이라는 점을 기회가 많이있을 때) 여기에 내가 무엇을 의미하는지의 예입니다 나는 같은 것을 할 경우, 내 ISP는 클라이언트와 서버 측에 아무 이유에 대한 접속을 닫습니다 :
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();
또는이 : 그들은합니다 (ISP)는 서비스와 네트워크의 일부를 변경했을 때
tcpOut.print("Hello.");
tcpOut.print("How are you?");
tcpOut.flush();
이 단지 몇 주 전에 시작했다. 나는 Wireshark를 사용하여 동일한 TCP 연결에 대해 두 패킷 사이에 적어도 ~ 150ms의 시간을 가져야한다는 것을 알아 차렸습니다. 그렇지 않으면 닫을 것입니다.
1)이 전화가 무엇인지 아십니까? 이름이 있니? 그것은 합법적입니까? send(PrintWriter out, String packetData);
2) 클라이언트로 전송하기 전에 데이터를 버퍼링 자바를 요청할 수있는 쉬운 해결책이 있습니까 :
지금은 내가라는 방법을 사용하는 것이 알고 내 게임 서버를 다시 작성해야? 또는 모든 것을 다시 쓸 필요없이 각 보내기 전에 150ms 기다리시겠습니까? 나는 약간의 인터넷 검색을했지만이 문제를 다루는 것을 찾을 수 없다. 이것에 대해 도움이되는 정보 또는 정보는 속도 최적화가 매우 중요하다는 점에서 정말 감사 할 것입니다. 고맙습니다.
이것은 올바르게 들리지 않습니다. 로컬 TCP/IP 스택은 감지 된 네트워크 속도에 따라 보내는 데이터를 버퍼링하고 지연 시키며, tcpSetNoDelay를 망쳐 놓지 않는 한 일반적으로 패킷을 병합하여 더 이상 합칩니다. 강제 폐쇄가 있다고 생각하는 것은 무엇입니까? 그리고 사용자가 실제로 6 줄을 초당 입력 할 수 있습니까? 또는 모든 개행 후에 애플리케이션이 불필요하게 플러시되는 것입니까? – EJP
의견을 보내 주셔서 감사합니다. 나는 100 %의 긍정적 인 ISP가 연결을 닫고있다, 나는 그것이 빨간색 재설정 패킷을 얻을 때 Wireshark에서 볼 수있다. 또한 몇 가지 테스트를 수행했습니다. 가끔씩 데이터가 하나의 패킷에 추가되었지만 (로컬 TCP/IP 스택), 때로는 서버가 플러시 할 때가 많지 않을 때가 있습니다. MMORPG 게임이므로지도에서 동시에 말하고 이동하고 공격 할 때 플러시가 많이 일어나므로 한 번에 두 개의 패킷이 동시에 한 명의 플레이어에게 전송되고 ISP가 닫습니다. 그 소켓. – Reacen
그리고 "같은 시간"은 100ms 미만의 지연을 의미합니다. – Reacen