2012-06-15 1 views
0

네트워크 검색을 수행하기 위해 MulticastSocket을 구현하는 Java 프로그램이 있습니다. 문제는 서버가 연속 된 ArrayList의 활성 공유가 5 초마다 특정 포트 (내 경우 4446)에 여러 패킷을 보낸 다음 클라이언트가이를 수신한다는 것입니다. 그러나 ArrayList이 수정 된 경우 서버는 다음 전송시이를 전송하지만 클라이언트는 수신시 서버가 이미 오래 전 보낸 이전 패키지를 수신합니다.MulticastSocket을 사용하여 항상 최신 패킷을받는 방법은 무엇입니까?

여기서 예이다 :

ArrayList 1 개 요소를 갖는다.

서버 -> 전송 -> 기다려 5초 -> 패킷 번호를 전송하는 단계 (2) -> 5 초 정도 ->기간 동안 ArrayList 수정 -> 패킷 번호를 전송하는 3

클라이언트 -> 액티브 주 찾는다 -> 수신 패킷 # 1 -> 1 요소! 승인! ... (무한한 시간 동안 기다릴 수 있음 -이 시간까지 # 2와 # 3이 서버에 의해 전송 됨)

클라이언트 -> 활성 공유 찾기 -> 수신 패킷 2 -> 1 요소 . 아니.

그리고 패킷 (이상적으로) # 3을 수신해야하므로 모든 일관성이 손실됩니다.

클라이언트가 항상 가장 최근에 보낸 패킷을 받도록 만들 수있는 방법이 있습니까? 고맙습니다.

답변

0

UDP와 마찬가지로 멀티 캐스트는 TCP와 같지 않습니다. 클라이언트에게 배달 또는 배달 순서가 보장되어 있지 않습니다. # 3을 얻지 못하면 고객이 수령하기 전에 데이터를 버릴 가능성이 있습니다.

클라이언트/서버 코드 작동에 대한 가정을 다시 확인합니다.

# 3 패킷을 잃어 가고 있습니까? 아니면 # 2 이전에 배달하고 # 2를 무시하고 싶습니까? 두 번째 경우라면 가능한 한 빨리 모든 패킷을 수집 할 수 있도록 코드를 작성해야합니다. 매우 낮은 타임 아웃으로 패킷을 루프에서 수신 한 후에 즉시 receive()를 시도하는 옵션이 있습니다. 이것은 커널 라운드 트립을 의미하는 so_timeout을 조정하고 모든 패킷에 대해 그렇게하는 것을 의미 할 수 있습니다.

더 좋은 방법은 소켓에서 지속적으로 읽는 스레드를 가지며 모든 패킷에 대해 다른 처리 스레드가 읽는 BlockingQueue에 넣는 것입니다. 이 방법으로 수신시 제한 시간에 대해 신경 쓸 필요가 없으며 단지 소비하기 때문에 jvm이 소켓에서 읽을 수있는만큼 빨리 패킷을 얻을 수 있습니다.

0

이것은 네트워크 통신의 고유 한 경쟁 조건입니다. 이전 보고서가 수신자에게 전송되는 동안 데이터 소스가 상태를 변경합니다.이 시점에서 이미 시간을 역전시키고 이미 유선에있는 데이터를 업데이트하려고합니다. 그렇게 할 수있는 편리한 라이브러리를 찾지 못했기 때문에 순서대로 패킷을 처리하는 것이 좋습니다.

여기 실제 답변은 적절한 communication protocol입니다. TCP 또는 UDP와 같은 전송이 아니라 사용자 고유의 응용 프로그램 수준 프로토콜. 위대한 예와 영감을 얻기 위해 TCP state transition diagram을 살펴 보았지만 관리가 쉬운 상태 머신으로 다소 복잡한 문제를 처리 할 수 ​​있음을 보여줍니다. 클라이언트와 서버 측면에서 상태를 정의하고, 이벤트와 전환을 정의하고 그에 따라 코드를 작성하십시오.