2011-01-22 4 views
3

내 Java 응용 프로그램에서 DatagramSocket 통해 DatagramPacket (s)를받습니다. 패킷에 포함될 수있는 최대 바이트 수는 알고 있지만 실제로 모든 패킷 길이는 다릅니다 (최대 길이를 초과하지 않음).받은 DatagramPacket 0x00 트리밍

MAX_PACKET_LENGTH = 1024 (바이트)라고 가정 해 봅시다. 따라서 DatagramPacket이 수신 될 때마다 1024 바이트 길이이지만 항상 모든 바이트가 정보를 포함하는 것은 아닙니다. 패킷에 10 바이트의 유용한 데이터가 있고 나머지 1014 바이트에 0x00이 채워질 수 있습니다.

유용한 데이터 만 다른 레이어로 전달하기 위해이 0x00 (사용되지 않은) 바이트를 트리밍하는 우아한 방법이 있다면 궁금합니다. (아마도 자바 원시 메소드? 루프에 들어가서 어떤 패킷이 포함되어 있는지 분석하는 것은 원하는 해결책이 아니다 :))

모든 힌트를 가져 주셔서 감사합니다. Piotr

답변

1

DatagramPacket에서 getLength를 호출하여 패킷의 ACTUAL 길이 (MAX_PACKET_LENGTH 미만일 수 있음)를 반환 할 수 있습니다.

+0

나는 패킷의 실제 길이를 반환하지 않을까 두려워. 다음 코드 : int LENGTH = 887; DatagramPacket p = 새 DatagramPacket (새 바이트 [길이], 길이); System.out.println (p.getLength()); 은 887 –

+1

을 출력합니다. 887은 패킷 길이 (생성자에 대한 3 번째 인수)이기 때문에 887이 인쇄됩니다. 이 값은 버퍼의 크기보다 작을 수 있습니다 (예제의 첫 번째'LENGTH').하지만 경우에 따라 다릅니다. –

0

이것은 너무 늦기는하지만 나 같은 사람에게 유용 할 수 있습니다.

private int bufferSize = 1024; 
/** 
* Sending the reply. 
*/ 
public void sendReply() { 
    DatagramPacket qPacket = null; 
    DatagramPacket reply = null; 
    int port = 8002; 
    try { 
     // Send reply. 
     if (qPacket != null) { 
      byte[] tmpBuffer = new byte[bufferSize]; 
          System.arraycopy(buffer, 0, tmpBuffer, 0, bufferSize); 
      reply = new DatagramPacket(tmpBuffer, tmpBuffer.length, 
        qPacket.getAddress(), port); 
      socket.send(reply); 

     } 

    } catch (Exception e) { 
     logger.error(" Could not able to recieve packet." 
       + e.fillInStackTrace()); 

    } 
} 
/** 
* Receives the UDP ping request. 
*/ 
public void recievePacket() { 
    DatagramPacket dPacket = null; 
    byte[] buf = new byte[bufferSize]; 
    try { 

     while (true) { 
      dPacket = new DatagramPacket(buf, buf.length); 
      socket.receive(dPacket); 
      // This is a global variable. 
      bufferSize = dPacket.getLength(); 

      sendReply(); 

     } 

    } catch (Exception e) { 
     logger.error(" Could not able to recieve packet." + e.fillInStackTrace()); 
    } finally { 
     if (socket != null) 
      socket.close(); 
    } 
} 
관련 문제