2012-03-15 2 views
4

WLAN 연결을 통해 TCP Java 서버와 통신하는 Android 애플리케이션을 개발 중입니다. 안드로이드 응용 프로그램은 스프라이트가 화면 주위를 움직이는 게임입니다. 스프라이트가 움직일 때마다 AndroidClient는 좌표를 Java 서버로 보내고 다른 클라이언트 (최대 4 클라이언트)에게 데이터를 보냅니다. 서버는 별도의 스레드에서 각 클라이언트를 처리하고 데이터 업데이트는 약 20ms마다 전송되며 각 패킷은 약 1-10 바이트로 구성됩니다. 나는 70 Mbit 네트워크에있다. (약 15 Mbit는 My Wireless에 유효하다.)Java TCP 대기 시간

불안정한 연결 및 약 50-500 ms에서 대기 시간이 발생하는 문제가 있습니다. 매 10 ~ 30 번째 패킷. tcpNoDelay를 true로 설정했습니다. 일관된 200ms 대기 시간이 중지되었지만 아직 많이 지연되었습니다. 나는 안드로이드와 네트워킹에 새로운 것이므로 이것이 기대되는지 아닌지는 모른다. 또한 UDP가 내 프로그램에 적합 할 수 있는지 궁금합니다. 제대로 도착하는 모든 패킷보다 빠른 속도로 업데이트를 보내고 싶습니다.

이 대기 시간 문제를 피하는 방법에 대한 안내는 감사하겠습니다. 클라이언트 - 서버 아키텍처를 구현하는 방법에 대한 일반적인 팁도 박수를 보냅니다.

+2

UDP가 확실히 좋은 옵션 같아 보입니다. 게임에 대해 –

+0

을 사용하면 일부 예측 (아마도 일부 게임에서 오판의 결과를 보았을 것입니다)을 추가하려고합니다. – ninjalj

+0

wireshark 또는 tcpdump를 사용하여 네트워크 활동을 캡처하고 여기에 게시하십시오. – gudok

답변

2

무선 LAN에서 때때로 지연된 패킷이 표시되어 지연 후 패킷이 재전송됩니다. 재전송 전에 지연을 제어하고 싶다면 UDP를 거의 사용해야 할 것입니다.

0

확실히 UDP를 사용하고 싶습니다. 게임에서는 짧은 시간 동안 스프라이트의 위치가 잘못 되었더라도 상관하지 않습니다. 따라서 UDP는이 경우에 이상적입니다.

또한 서버 코드를 제어 할 수 있다면 클라이언트에 별도의 스레드를 사용하지 않을 것입니다. 쓰레드는 제어 할 수없고 차단할 수있는 라이브러리 호출 (예 : 파일을 건드 리거나 추가 네트워크 통신을 시도하기 때문에)을 호출해야 할 때 유용합니다. 그러나 그들은 비싸다. 그들은 많은 자원을 소비합니다. 따라서 실제적으로 그들은 보다 느리게 일을합니다.

대기 시간과 성능이 절대적으로 중요한 네트워크 게임 서버의 경우 하나의 스레드를 사용하여 상태가있는 명령 대기열을 처리 한 다음 차단 작업을 수행하지 않도록하십시오. 각 명령이 순서대로 처리되므로 상태가 평가되고 업데이트됩니다 (다른 개체와 교차 된 레이저 폭발처럼). 명령이 파일에서 읽는 것과 같이 차단이 필요한 경우 비 차단 읽기를 수행하고 해당 명령의 상태를 설정하여 명령 프로세서가 결코 차단되지 않도록해야합니다. 핵심은 명령 프로세서가 절대 절대로 차단 될 수 없다는 것입니다. 그것은 단지 루프에서 실행되지만 CPU를 낭비하지 않도록 적절한 방법으로 Thread.sleep (x)를 호출해야합니다.

클라이언트 측에서는 클라이언트가 명령을 제출할 때 (레이저 등을 발사 한 것처럼) 클라이언트가 응답 객체를 생성하고 시퀀스 ID를 키로 사용하여 맵에 삽입합니다. 그런 다음 시퀀스 ID를 사용하여 요청을 보내고 서버가 해당 ID로 응답하면 Map에서 응답 객체를 조회하고 해당 객체로 응답을 디코딩합니다. 이것은 동시 작업을 수행 할 수 있음을 의미합니다.