2014-09-19 2 views
0

Java 및 UDP 발신자 및 수신자를 사용하는 클래스 용 프로젝트 작업 중입니다. 문제의 전제는 텍스트 파일을 읽고, 내용을 패킷에 저장하고, 패킷을 보내고, 패킷을 수신하고, 화면에서 파일을 읽고, 동일한 텍스트 파일의 수신 컴퓨터에 새 텍스트 문서를 작성하는 것입니다 .Java UDP 패킷 송수신 문제

나는 모든 작업을하고 있습니다. 로컬 호스트로 테스트 할 때 100 % 시간 동안 작동하는 것으로 보입니다. 내 노트북에서 PC로 보낼 때 100 % 작동하는 것으로 보입니다. 그러나 내 PC에서 내 랩톱으로 보낼 때 작동하지 않습니다.

몇 가지 System.out 디버그 문을 통해 보낸 정보 중 일부를 확인할 수 있습니다. 나는 텍스트 파일이 7 개의 패킷을 가져야한다는 것을 안다. 그러나 내 PC에서 랩톱으로 보낼 때마다 46 패킷을 보내고 있다고합니다.

필자의 초기 생각은 패킷이 순서가 틀린 것으로 보입니다. 내가 보내는 첫 번째 패킷은 수신자가 수신해야하는 패킷의 수를 나타냅니다. 어쩌면 "46"이 "F"라는 자본을 나타낼 수 있다고 생각했기 때문에 모든 자본 "F"를 제거했으며 여전히 46 패킷을 보내고 있다고합니다.

나는 너무 많은 정보를 한꺼번에 보내고 싶었 기 때문에 Thread.sleep()을 사용하여 수신자가 시간을 지킬 수있을 것이라고 생각했다.

마지막으로, Oracle 설명서와 온라인 게시물을 통해 UDP를 신뢰할 수 없다는 사실을 알게되었습니다. 그래서 잠재적으로 그렇게 할 수 있다고 가정하고 있습니다. 그러나, 그게 문제가 될 수 있는지 확인하고 싶습니다.

누군가가 더 멋진 아이디어가 될 수있는 문제에 대해 더 좋은 아이디어가 있다면!

감사합니다.

답변

0

예, UDP는 신뢰할 수없는 프로토콜입니다. UDP 메시지가 손실 될 수 있으며 보낸 사람 또는받는 사람도 알림을받지 못합니다.

7 패킷이 46 패킷이되는 것은 일반적으로 IP 패킷 수준에서 fragmentation이 원인입니다. IP 아래의 프로토콜 수준 (예 : 물리적 이더넷 패킷, Wi-Fi 패킷 등)은 일반적으로 "한 번에"전송 될 수있는 가장 큰 IP 패킷에 대해 엄격한 제한을두고 네트워크 라우터, 게이트웨이 등에서 유사한 제한이 부과됩니다. 한계보다 큰 IP 패킷이 전송되는 경우 두 가지 상황이 발생할 수 있습니다

  • IP 패킷은 수신기에 의해 재 조립해야 "조각"으로 설정되어 있습니다.

  • 중간 장비는 송신자에게 작은 IP 패킷을 보내도록 ICMP 메시지를 보낼 수 있습니다.

어느 경우 든 주어진 크기의 UDP 메시지를 보내는 데 필요한 IP 패킷의 수는 네트워크에 따라 다를 수 있습니다.

물론 UDP 메시지를 여러 IP 패킷으로 보내야하고 네트워크에 로컬 정체가 있으면 패킷의 가능성이 높아져 메시지가 실패합니다.


하지만 결론은 UDP가 신뢰할 수 없다는 것입니다. 신뢰성을 원한다면 간단한 해결책은 대신 TCP를 사용하는 것입니다.

+0

굉장한 답변, 고마워! 나는 그것을 시험하기로 결정했다. 나는 그것이 우연인지 아닌지 잘 모르겠다. 나는 노트북에서 내 컴퓨터로 Youtube 비디오를 재생 해 보았습니다. UDP 수신기는 106 패킷을 받았으며 궁극적으로 메시지를 제대로받지 못했습니다. 나는 그 (것)들을 전부 돌았 다 그들을 다시 보내고 그것은 작동했다. 내 컴퓨터에서 내 랩톱으로 동일한 실험을했는데 동일한 결과가있었습니다. 우연이 아닌지 다시 한 번 확신하지만, 당신이 말한 것과 실험에서 내 문제에 대한 해답 인 것 같습니다. 고마워요 :) – BearForceOne

+0

@ BearForceOne - 그게 문제로 패킷 손실을 가리 킵니다. 단일 패킷을 잃어 버리면 전체 UDP 메시지가 손실되고 결과적으로 파일 전송이 실패합니다. –