2012-03-13 3 views
8

XMPP를 통해 턴베이스 게임을 개발하려고합니다. (멀티 플랫폼 게임에서 찾은 유일한 해결책). 문제없이 메시지를 보낼 수 있습니다. 다른 사용자가 온라인 상태가 아니면 서버 (OpenFire)가 나중에 제공하기 위해 저장합니다.기기에서 XMPP를 통한 메시지 손실 문제가 발생했습니다.

기기가 네트워크를 변경 (3g에서 WiFi로 변경, 3g IP로 변경)하거나 기기가 네트워크를 잃어 버렸을 때 (3g, wifi 또는 연결 끊김을 해제) 문제가 발생합니다. 서버는 장치가 온라인 상태이며 메시지를 보냈지 만 그 메시지는 절대 도착하지 않으므로 패킷이 손실됩니다.

하나의 해결책을 알고 있습니다. 내 게임 프로토콜을 통해 ACK를 구현하지만, 나는이 아이디어를별로 좋아하지 않는다. 다른 제안이 있으십니까? 나는 이것이 서버 문제라고 생각한다. 당신은 다른 서버 마녀가 TCP 또는 ACK를 구현한다는 것을 알고 있습니까?

감사합니다.

편집 : 할 일 : 서버에 장치를 연결하십시오. 나는 장치에 대한 3G 및 WiFi 연결을 끊습니다. 안드로이드와 서버는 여전히 연결이 살아 있다고 생각합니다.

http://issues.igniterealtime.org/browse/SMACK-331

PD는 : 그들은 API를 멀티 플레이어 나는 오픈 페인트를 요청하지만, 그들은 ... TCP/IP는 신뢰할 수 없습니다 일부 조건에서

+0

오. 나는 참여했다. 이걸 개발해도 될까요? – user2160008

+0

안녕하세요 LeiNaD_87 솔루션을 찾으셨습니까? 고맙습니다. –

+0

아니요,하지 않았습니다. 나는 또한이 문제를 연구하는 것을 멈췄다. –

답변

0

날 asnwer하지 않았다. 이것이 ACK, 메시지 수신, IQ 또는 XMPP의 다른 확장이이 문제를 해결할 수있는 이유입니다.

나는 Openfire와 함께 여러 해 동안 모바일 프로그래밍을 많이 해왔다. 그러나 나는 잃어버린 메시지를 보지 못했습니다. 그래서 안드로이드 나 Openfire 버전에서 사용하고있는 라이브러리에 문제가 있다고 가정합니다. 대신 당신은 또한 허튼 소리를 사용하여 원시 소켓을 사용

:
http://xmpp.org/extensions/xep-0124.html
허튼 소리는 혜성처럼 WebRequests를 기반으로하고 느슨한 자주 연결을 전환하거나 환경에서 잘 작동합니다. 하나 이상의 요청이 연속으로 실패 할 때까지 네트워크가 다시 연결될 때까지 연결을 유지할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. BOSH가이 문제에 대한 좋은 해결책이 아닌 것 같습니다. 모바일 장치는 다른 인터페이스/IP를 통해 연결할 수 있습니다. –

+0

OpenFire에서 BOSH를 테스트하면 그 결과는 같습니다. 네트워크 인터페이스에서 손실 된 패킷이 변경되었습니다. OF 구성에서 BOSH를 활성화하고 BOSHConnection으로 변경 연결을 변경합니다. –

+0

이것은 사용하는 코드베이스와 서버 구성에 따라 다릅니다. 서버는 세션을 충분히 오랫동안 유지하도록 구성되어야하며 라이브러리는 재전송 요청을 지원해야하며 네트워크 장애시 연결을 끊지 않아야합니다. – Alex

1

이 경우 BOSH가 작동하지만 다른 옵션은 XEP-0198 : 스트림 관리입니다. 이렇게하면 빠른 연결, 긍정적 인 acking 및 queuing과 함께 완벽하게 연결된 소켓의 모든 성능을 얻을 수 있습니다. 반면에 un-acked 또는 disconnected는 양방향입니다.

0

나는 또한이 문제를 해결하기 위해이 문제를 해결할 수있는 적절한 방법을 찾아 내려고 노력했습니다.

문제점은 오프라인 메시지 정책을 "항상 저장"으로 설정했기 때문에 XEP-0184가 메시지가 수신자에게 전달되지 않는 것을 확인하는 데 도움이되지 않는다는 것입니다.

이 시나리오 제공 : 를 - 메시지를 떨어있어 A는 을 알리지 않습니다 - - B의 연결이 바로 잃었다 동안 B에게 메시지를 보냅니다 -이 경우에는 내가 2 사용자가 그들에게 전화와 B 는 채팅이 A는 메시지가 삭제되었음을 알지 못합니다. 메시지가 서버에 배달되었다고 가정합니다. 서버는 결국 B 에게 메시지를 전달합니다.-B는 영원히 메시지를 잃습니다.

임시로 해결 방법을 넣습니다. 이것을 위해 ... 나는 배달되지 않은 메시지를 모두 저장합니다.메시지 배달 확인을받지 못함)을 대기열에 넣은 다음 주기적으로 (예 : 6 분 - 대기 연결이 삭제 된 시간) 대기열의 모든 메시지를 검사하여 의도 된 수신자가 "온라인"이고 영수증 여전히받지 못했습니다 ... 그럴 경우 해당 메시지를 "배달 실패"로 표시합니다.

이 문제를 해결하는 것은 매우 어려운 방법입니다. 더 나은 방법이 있다면 조언하십시오. 최선의 방법은 서버가 이것을 수행하도록하는 것입니다. 메시지 전달이 실패하고 오프라인 메시지 정책이 "항상 저장"인 경우 지연 배달을 위해 "오프 라인"에 저장합니다.

+0

"대답이 아닙니다"라고 표시되지 않도록 질문 부분을 답안에서 삭제하는 것이 좋습니다. – bummi

+0

감사합니다. 질문 부분을 삭제했습니다. – MonkeyDL

0

이전 버전이지만 최근에 그런 문제를 해결하고있었습니다. 연결을 만들 때 XMPP 자원 (전체 JID의 마지막 부분)을 적당한 것으로 설정하면 도움이되었습니다. 그렇지 않으면 각 재 연결시 임의로 생성되며 전체 JID가 변경됩니다.

관련 문제