Java - UDP отправляет данные через сокет .. не рек. все данные - PullRequest
2 голосов
/ 06 марта 2012

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

Я тестирую его на локальной машине в 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);
    }
}

Раньше у меня был if if в цикле while (true), чтобы проверить, меньше ли длина пакета, чем 512 байт, чтобы он знал, когда прервать;

Я думал, что есть проблема с этим, но кажется, что сейчас все в порядке, я просто подожду несколько минут и затем остановлю приложение Client.java

Файл передается, но исходный файл имеет размер 852 КБ, и до сих пор я получил 777, 800, 850, .. но никогда не все из них.

Ответы [ 2 ]

1 голос
/ 06 марта 2012

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

См. Когда целесообразно использовать UDP вместо TCP?

0 голосов
/ 06 марта 2012

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

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

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

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

...