2012-10-22 2 views
0

LAN의 서버에 연결할 다중 클라이언트 응용 프로그램에서 작업하고 있습니다.LAN에서 클라이언트를 최신 상태로 유지하는 가장 좋은 방법은 - Java 네트워킹

모든 클라이언트는 서버의 상태를 변경하는 명령을 보낼 수 있습니다. 이 'ServerStatus'는 내가 호출 하듯이 일부 값을 가진 객체입니다.

이제 ServerStatus가 변경되면 모든 클라이언트가 즉시 알아야합니다. 내 아이디어는 다음과 같이 작동하는 것입니다.

서버는 매초 ServerStatus의 versionNumber를 사용하여 모든 수신 클라이언트에 멀티 캐스트를 보냅니다. 따라서 새 클라이언트가 멀티 캐스트 그룹에 참여하면 versionNumber가 동일한 지 확인할 수 있습니다. 그렇지 않은 경우 클라이언트는 UDP를 통해 ServerStatus의 현재 버전을 묻습니다. 클라이언트가 동일한 멀티 캐스트 그룹에 자신의 현재 (새로운) ServerStatus를 보내드립니다 ServerStatus, 서버를 변경하는 명령을 전송

, 다른 스레드에서, ServerStatus의의 versionNumber는 여전히 매 초마다 공유된다.

여러분이이 문제를 해결하는 좋은 방법이라고 생각하십니까? 또는 너무 많은 문제가 발생합니다 ... 등

+0

UDP 멀티 캐스트 (if if, 즉사용 가능) 좋은 방법입니다. 1 초는 "즉각"이 아니므로 클라이언트는 업데이트 요청을 멀티 캐스트하고 서버 (또는 피어도 가능)가 새로 조인 된 요청을 업데이트합니다. 유실 (또는 순서가 잘못된) 된 UDP 패킷을 처리해야 할 수도 있습니다. 이를 달성하기위한 많은 프레임 워크가 있습니다 - jgroups, aka는 몇 가지 예입니다. – bestsss

답변

1

새 ServerStatus가 클라이언트에 도달하지 못하면 어떻게됩니까? 제 의견으로는 새로운 상태를 클라이언트에 보낼 때 UDP를 사용하지 말고 신뢰할 수있는 프로토콜을 사용해야합니다. 따라서 멀티 캐스트를 사용하려는 경우 reliable multicast protocol을 가져야합니다.

한편

, 당신은 서버와 클라이언트 동기화를 선호 할 수 있습니다 : 동일하지 않을 경우

  • 때마다 클라이언트가 (이 을 statusid의 서버에 요청 네트워크 진입의 서버는 ServerStatus를 보냅니다) 클라이언트는 또한 새로운 상태 변경 이벤트를 등록합니다. (TCP)

  • 나가면 클라이언트가 UNREGISTER 메시지 (UDP)를 보낼 수 있습니다.

  • ServerStatus가 변경 될 때마다 서버는 등록 된 각 클라이언트에 새 ServerStatus를 보냅니다. 새 Serverstatus를 수신하면 클라이언트는 서버에 ack와 유사한 메시지를 보냅니다. (TCP)

  • 서버에서 확인을받지 못하면 해당 클라이언트가 등록 취소됩니다 (클라이언트에 등록을하지 않고 네트워크를 떠났다 - 오류로). 이 도움이

희망 .. 기본적으로

1

, 당신의 생각은
난 당신이 "group communication"의 원칙에 더 많은 발굴, 및 jGroups 같은 프레임 워크를 보면 제안 나에게 좋은 소리, 나는 알고 JBoss Cache는이를 사용하여 노드 사이에서 데이터를 분산시킵니다.
신뢰할 수있는 클라이언트의 경우 X 초 내에 서버에 한 번만 쿼리하여 정확한 버전 번호 (
)가 있는지 확인하거나 적어도 충돌을 시작/복구 할 때이 작업을 수행해야합니다.