2013-08-25 2 views
3

내 멀티 플레이어 게임에서 서버 - 클라이언트 통신 구조를 연구 중입니다.멀티 플레이어 게임용 멀티 캐스트

패킷을 잃어 버렸을 때 응용 프로그램을 차단하지 않는 "촬영 및 잊어"방법을 사용하기 때문에 UDP가 최상의 선택이라는 결론에 도달했습니다. 또한 TCP를 사용하여 서버의 변경, 맵 변경, 업데이트 등의 로그인 절차 및 정보 교환과 같이 패킷이 필요한 안정성을 보냅니다. IRC 기반 채팅도 실행합니다. (모든 명령은 실제로 IRC 스타일의 사용자 정의 메시지입니다).

저는 서버와 클라이언트 간의 상호 작용 메시지 (동작, 주문, 객체, 동작 등)를 보내는 가장 좋은 방법이 무엇인지 궁금합니다.

일부 설명서를 읽다가 MulticastSocket을 방문했습니다.

내 질문은 :

각에서는 DatagramSockets 각각의 새를 보내는 큐를들을 곳 (I은 TCP 통신에서처럼) 각 선수에 대한 스레드를 시작하는 모든 고객에게 정보의 지속적인 흐름을 전송하는 것이 좋습니다 메시지를 클라이언트에 보냅니다. 이것은 모든지도와 모든 움직임 (지도 위에 50 명의 플레이어가있을 수 있다고 가정)이 모든 플레이어에게 보내지고, 모든 패킷이 모든 정보를 포함하기 위해 커야 함을 의미합니다. 또는 각 맵에 대해 스레드를 사용하는 것이 좋습니다. 일부 플레이어가 특정 맵에 있거나 멀티 캐스트 통신을 사용하여 해당 맵에있는 플레이어에게만 메시지를 보내고 MulticastSocket으로 수신하는 경우에만 활성화됩니다.

멀티 캐스트를 사용하는 방화벽이나 라우터의 문제에 대해 읽었지만 이러한 문제가 (정상적인 UDP와는 다른) 무엇인지 파악할 수 없습니다.

응용 프로그램

은 몇 가지 구성 문제를 가진 사람에 의해 사용되어야한다. 당신이 TCP 연결이 TCP 연결 당 하나 개의 스레드를 필요로 응용 프로그램이 절대적으로 TCP 연결을 필요로하는 경우 (NIO를 사용하지 않는 한), 예외를 결정하지 할 필요가 위의 시나리오를 보면

+0

일부 라우터는 네트워크에서 원하지 않는 트래픽을 유발할 수 있으므로 멀티 캐스트 패킷을 차단하도록 구성됩니다. 와일드 카드 주소를 사용하여 네트워크 전체에서 더미 멀티 캐스트 패킷을 스팸하는 악의적 인 사용자를 상상해보십시오. 패킷의 범위 또한 중요합니다. 패킷은 사설 LAN과 같은 소규모 네트워크에 비해 더 큰 네트워크 (예 : 인터넷)에있는 경우 도달 할 가능성이 적습니다. 이것이 (여전히 멀티 캐스트를 사용하면서) 피할 수 있는지 여부에 관해서는, 나는 당신에게 좋은 대답을 줄 수 없다. – initramfs

+0

나는 멀티 캐스트를 고집하지 않고있다. 실제로 UDP가있는 통신 서버 클라이언트를 만드는 가장 좋은 방법은 무엇인가에 관한 것이므로 문제없이 바꿀 수있다. 아마도 멀티 캐스트 소켓을 에뮬레이트하는 클래스를 만들 수 있습니다. 동일한 패킷을 한 번에 여러 클라이언트에 전송할 수 있습니까? 그러나 그것이 충분히 빠를 것인지 나는 모른다. 귀하의 의견을 보내 주셔서 감사합니다 – Gianmarco

+0

나는 속도보다 대역폭에 더 염려됩니다. 멀티 캐스트 패킷은 연결 당 패킷이 필요한 기존의 네트워크 구조와 비교하여 한 번 전송됩니다.서버에 50 명의 플레이어가있는 경우 연결된 단일 사용자와 비교하여 50x 대역폭을 고려해야합니다. 나는 멀티 캐스트 패킷에 대한 나의 통찰력만을 제공했다. – initramfs

답변

2

.

가) 당신은 모든 선수에 대한 데이터 그램 패킷을 수신 한 스레드를 생성 :

지금 프로그램의 UDP 섹션을 대상으로, 당신은 두 가지 기본 선택 사항이 있습니다.

이 경우 모든 플레이어는 자신의 데이터 그램 패킷을 단일 수신기로 보내고 데이터 수신자는 해당 데이터로 수행 할 작업을 결정합니다. 이 데이터는 처리를 위해 다른 스레드에 대한 다양한 대기열로 전송 될 수 있습니다. 단일 스레드 또는 여러 스레드 (플레이어 당)를 사용하여 모든 플레이어에게 데이터를 다시 보낼 수 있습니다.

총 :

  • 낮은 리소스 사용
  • 낮은 프로그램 (동기화) 오버 헤드.

단점 :

  • 가능한 네트워크 속도 저하 다시 패킷 드롭 (의
  • 높은 기회 (때문에 같은 소켓으로가는 패킷의 대중에게) 때문에가는 패킷의 대중에게 같은 소켓)
  • 분리 이벤트가
  • 처리 할 지저분하고 어려운
  • 직렬 처리3210

b) 플레이어 당 스레드 하나를 생성하고 플레이어마다 다른 포트에서 수신 대기합니다.

이 경우 모든 플레이어는 데이터를 직접 처리하거나 중앙 처리 대기열로 보낼 수있는 자체 처리기 스레드를 갖습니다. 이를 통해 데이터를 병렬로 처리 할 수 ​​있으므로 더 높은 리소스 사용으로 더 빠른 처리 속도가 가능합니다. 동기화에는 특별한주의가 필요하며, 원자의 사용과 재진입 읽기/쓰기 잠금이 필요할 수 있습니다. 소켓에 다시 쓰는 것은 일반적으로 다른 "플레이어 스레드마다"발생해야합니다.

총 :

  • 병렬 처리
  • 모듈
  • 를 끊고는 쉽게 처리 할 수 ​​있습니다과 그렇지 않은 (하나 개의 스레드에서 선수 당 모든 처리 코드가 플레이어에서 스레드를 시작 가입) 다른 플레이어와 문제를 일으킬 수 있습니다.
  • 빠른 네트워크 응답, 동시 패킷 수신.

단점 :

  • 높은 리소스 사용 (더 많은 개체)
  • 높은 동기화 오버 헤드
  • 높은 스레드 수 (선수 비율만큼의 4 배 ~ 2와 스레드 수있다)

어느 경우이든 TCP를 사용하면 이 필요합니다. 플레이어 당 적어도 하나의 스레드. 문제는 서버에서 더 부드럽고 신속한 응답을 위해 더 많은 리소스를 사용할 의향입니다.

+0

을 수락했습니다. 감사 – Gianmarco