2012-03-06 2 views
2

내가 쓴 클라이언트 - 서버 응용 프로그램은 작동하지만 모든 데이터가 매번 처리되는 것 같지는 않습니다.Java - 소켓을 통한 데이터 전송 UDP .. rec. 모든 데이터

Eclipse 환경에서 로컬 시스템에서 테스트하고 있습니다.

서버 :

private void sendData() throws Exception 
{ 
    DatagramPacket data = new DatagramPacket(outgoingData, outgoingData.length, clientAddress, clientPort); 
    InputStream fis = new FileInputStream(responseData); 

    int a; 
    while((a = fis.read(outgoingData,0,512)) != -1) 
    { 
     serverSocket.send(data); 
    } 
} 

클라이언트 :

다른 경우 나는 동안이하는 데 사용
private void receiveData() throws Exception 
{ 
    DatagramPacket receiveData = new DatagramPacket(incomingData, incomingData.length); 
    OutputStream fos = new FileOutputStream(new File("1"+data)); 
    while(true) 
    { 
     clientSocket.receive(receiveData); 
     fos.write(incomingData); 
    } 
} 

(참) 루프는 패킷 길이는 경우에 그것을 알고 미만 512 바이트 있도록되어 있는지 확인하려면 단절;

내가 거기에 문제 오순절이었다고하지만 지금 난 그냥 몇 분 정도 기다렸다가 Client.java 응용 프로그램

파일이 전송을 수행하지만, 원본 파일 지금까지 852킬로바이트하고 중지를위한두면이었다 보인다 생각

나는 777, 800, 850을 가지고있다. 그러나 결코 그것의 누구나.

+0

스트림을 플러시 해 보셨습니까? –

+2

UDP가 신뢰할 수 없습니다. UDP 사양은 UDP가 소스에서 수신자로 패킷을 가져 오는 "최선의 노력"을하지만 패킷이 삭제되고 수신자/발신자에게 알림이 전송되지 않는다고 명시합니다. 안정적으로 데이터를 보내야하는 경우 일종의 패킷 손실 감지 체계를 구현하거나 대신 TCP를 사용해야 할 것입니다. 현지 감각으로 너무 많은 패킷을 잃어 버리는 것은 다소 이상하지만 로컬 UDP 연결이 안정적이어야한다는 어떠한 계약도 없습니다. – CodeBlind

+0

나는 이해한다. 그러나 나는 가능한 한 많은 것을 얻는 것을 도울 수있는 방법을 찾아 내려고 노력 중이다. –

답변

1

근본적인 문제는 UDP가 배달을 보장하지 않는다는 것입니다. UDP를 사용하려면 이 있어야합니다 (예 : TCP). 손실 된 패킷, 도착하지 못한 패킷 또는 여러 번 배달 된 패킷을 감지하고 처리하는 체계를 구현해야합니다.

당신은 아마 파일을 전송하는 TCP를 사용한다 When is it appropriate to use UDP instead of TCP?

0

참조하십시오. 그 동안 반복적으로 패킷을 보내므로 패킷을 잃어 버릴 수 있습니다.

int a; 
while((a = fis.read(outgoingData,0,512)) != -1) 
{ 
    serverSocket.send(data); 
} 

너무 빨리 보내는 것이므로 올바른 순서로 수신 할 가능성이 매우 높습니다. 일부 패킷은 아마도 그것 때문에 손실 될 것입니다.

또한 고정 크기의 512 바이트를 보내면 마지막으로 보낸 패킷이 정확히 그 크기가 아니기 때문에 "look wierd"파일의 끝 부분을 볼 수 있습니다.

관련 문제