2013-05-19 3 views
0

발신자에서 수신자로 간단한 UDP file.txt 전송을하고 있습니다. 그것은 프롬프트로 도착했습니다 ..하지만, 내가 내용을 인쇄 할 때 일부는 올바르게 나왔지만 일부는 수신자 측에서받은 이전 단어로 매시업되었습니다.UDP가 데이터 패킷을 수신했지만 재미있는 결과를 출력합니다.

내가 무엇을 의미 : 텍스트 파일의 내용이 ALL IN ONE 문장과 같은 : 1 일 이후

일, 주 주 제네바 내 복귀에 돌아가신 후, 수신기 측

예 :

일 weekr가 가 가

,536 제네바 toturn myayed 창 을 onayed awayed 통과 후 weekr 일, R 후 이것에 대한

코드는 다음과 같습니다

byte[] byteArray = new byte[9999]; 
     DatagramSocket listenSocket = new DatagramSocket(5001, InetAddress.getByName("127.0.0.1")); 
    while(true) { 
     DatagramPacket segment = new DatagramPacket(byteArray, byteArray.length); 
     listenSocket.receive(segment); 
     ByteArrayInputStream byteIn = new ByteArrayInputStream(segment.getData()); 
     int data = byteIn.read(); 
     if(data == -1) { 
     //break; 
     } else { 
      System.out.println("Got: " + new String(segment.getData())); 
     } 

예, TCP는 더 나은 옵션했을하지만 문제는이 경우에 발생하는 이유에 도움이 필요합니다. 여러분 모두가이 문제에 대한 통찰력을 줄 수 있기를 바랍니다.

+2

UDP는 올바른 순서와 중복 된 보호를 보장하지 않습니다. 이 기능이 필요한 경우 TCP를 사용하거나 UDP를 기반으로 모든 서비스를 직접 구현해야합니다. – dirkk

답변

1

버퍼를 처음 사용한 후에는 버퍼를 비우는 것을 잊었습니다. 따라서 연속적인 수신이 이전 데이터보다 적은 데이터를 얻으면 이전 데이터 중 일부를 다시 읽게됩니다.

+0

알았어, 네가 그 반응을 본 직후에 마침내 제대로 작동 했어. 내가 한 것은 버퍼를 단순히 while 루프 내부로 이동시켜 이전 단어를 지우는 것입니다. – user2399234

+1

이렇게하면 문제가 해결되지만 비효율적입니다. 할당하고 GC를 너무 자주 수행합니다. 블랭킹하거나 수신 길이를 사용하여 잘라내십시오. –

+0

그것은 매우 사실입니다. 바로 내가 이것을 위해 자바 메소드를 사냥 할 것이다. – user2399234

관련 문제