2012-03-06 2 views
2

Казалось бы, что приложение Client-Server, которое я написал, работает, однако кажется, что не все данные обрабатываются каждый раз.Java - UDP отправка данные через гнездо .. нет rec. все данные

Я тестирую его на локальной машине в Eclipse env.

Сервер:

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

Файл делает передачу, но исходный файл 852kb и до сих пор Я получил 777, 800, 850, .. но никогда не все.

+0

Вы пытались смыть потоки? –

+2

UDP является ненадежным. Спецификация для UDP заявляет, что UDP сделает «лучшее усилие» для получения пакета от источника к получателю, но пакеты могут быть удалены, и получатель/отправитель никогда не будет уведомлен. Если вам нужно надежно отправлять данные, вам понадобится реализовать какую-то схему обнаружения потерь пакетов или вместо этого использовать TCP. Немного странно, что вы теряете столько пакетов в локальном смысле, но нет контракта о том, что локальные UDP-соединения должны быть надежными. – CodeBlind

+0

Я понимаю это, но все же я пытаюсь выяснить, как я могу помочь, чтобы получить как можно больше. –

ответ

1

Основная проблема с вашим подходом заключается в том, что UDP не гарантирует доставку. Если у вас есть для использования UDP (а не, скажем, TCP), вам необходимо реализовать схему, которая будет обнаруживать и обрабатывать потерянные пакеты, выходить из строя или доставляться несколько раз.

См When is it appropriate to use UDP instead of TCP?

0

Вы, вероятно, следует использовать TCP для передачи файлов. Вероятно, вы теряете пакеты, потому что вы отправляете их так быстро в этом цикле.

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

Поскольку вы отправляете так быстро, я очень сомневаюсь, что у него будет шанс получить в правильном порядке. из-за этого некоторые пакеты также будут потеряны.

Кроме того, поскольку вы отправляете фиксированный размер в 512 байт, последний отправляемый вами пакет, вероятно, не будет именно такого размера, поэтому вы увидите, что конец файла «выглядит странным».

Смежные вопросы