2011-03-20 3 views
1

내 과제는 (성공적으로 구현 된 java를 사용하여) UDP 서비스를 사용하여 이미지 파일을 보내는 것을 포함합니다. 교수님은 "교환 된 데이터 메시지에는 보낸 사람이 수신자 쪽에서 중복 필터링을 위해 16 비트 메시지 시퀀스 번호를 포함하도록 헤더 부분이 있어야합니다."라고 물었습니다. 내가 어떻게 할 수 있니? 아무도 나를 도울 수 있습니다. plz 자사의 긴급한UDP 클라이언트/서버 .... 중복 필터링을위한 16 비트 메시지 시퀀스 번호 포함

+0

음, 지금까지 무엇을 시도 했습니까? –

+0

UDP를 사용하여 이미지를 trasnfer하는 데 사용되는 일반 방법 인 ive를 사용하면 ... 이것은 우리에게 추가 작업이었습니다 .... –

답변

3

당신의 UDP 패킷을 만들 것으로 가정하고, 당신은 데이터를 생성하기 위해 ByteArrayOutputStream을 사용하고 있습니다. 이 경우, 해당 ByteArrayOutputStream 맨 위에 DataOutputStream을 랩핑하고 스트림에 이미지 데이터를 쓰기 전에 writeInt (somesequenceNumber)를 호출하십시오.

수신 측에서 반대 방향으로 DataInputStream을 ByteArrayInputStream 주위에 랩하고 readInt()를 호출하여 시퀀스 번호를 가져옵니다. 여기에서 이미이 패킷을 받았는지 여부를 확인할 수 있습니다.

뭔가 쓰기 측면

같은

ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
DataOutputStream dos = new DataOutputStream(baos); 

dos.writeInt(sequenceNumber++); 
dos.writeInt(imageDataLength); 
dos.write(imageData); 

dos.flush(); 

byte[] udpPacketBytes = baos.toByteArray(); 

읽기 사이드 seenSequenceNumbers 몇 가지 설정 내가 DataOutputStream.writeShort을 사용하는 16 비트 값을

+0

저의 작은 예를 보여줄 수 있습니까? –

1

(이다

ByteArrayInputStream bais = new ByteArrayInputStream(udpPacketBytes); 
DataInputStream dis = new DataInputStream(bais); 
int sequenceNumber = dis.readInt(); 
if (seenSequenceNumbers.add(Integer.valueOf(sequenceNumber))) 
{ 
    int imageLength = dis.readInt(); 
    byte[] imageData = new byte[imageLength]; 
    dis.read(imageData); 
} 

) 및 DataInputSTream readShort()/readUnsignedShort()입니다. writeInt() 및 readInt()는 32 비트 값입니다. 중복을 피하려면 어떤 경우에도 32 비트 값이 더 나은 선택 일 수 있습니다. ;)