2016-02-11 3 views
1

Я пытаюсь имитировать UDP с помощью Java. Я отправляю файл с одного узла на другой. Это часть приемника:Java - закрытие UDP-сокета

server.setSoTimeout(10000);  
while (true) 
{ 
    try 
    { 
     DatagramPacket received = new DatagramPacket(receivedData,receivedData.length); 
     server.receive(received); 
     out.write(received.getData()); 
    } 
    catch (IOException e) { 
       break; 
      } 



    } 
server.close(); 

Это решение работает, но по какой-то причине меня это не устраивает.

Отправитель отправляет все пакеты, а затем закрывает DatagramSocket. Получатель получает все пакеты, и он завершается, но он завершается из-за таймаута.

Так что если вы включите мой ресивер и ничего не выполняете в течение 10 секунд, мой приемник отключается, поэтому ничего не передается.

Есть ли способ прекратить цикл без указания таймаута?

Мне также интересно, существует ли способ для другого хоста установить соединение - что-то вроде ServerSocket.accept(), которое в основном ждет другого хоста для подключения. Но я решил использовать DatagramSocket, и я могу найти решение этой проблемы.

Кто-нибудь знает о методе, который будет выполнять это?

+0

Подождите, чтобы вы хотели включить приемник, пока отправитель не отправит файл? –

+1

UDP - протокол без установления соединения. Нет понятия соединения, а только отдельных пакетов. Также нет гарантии, что эти пакеты поступят в правильном порядке. Похоже, вы хотите, чтобы TCP, а не UDP ... –

+0

@RileyCarney хорошо, что идея не использует таймаут, но чтобы указать, что все байты были отправлены –

ответ

2

Номер

дейтаграмм (UDP) сокеты по своей сути без установления соединения. Закрытие DatagramSocket не влияет на видимость удаленной системы. Это не позволяет приложению отправлять или получать какие-либо дополнительные данные в этом сокете и освобождает порт для использования другими приложениями в локальной системе, но это не приводит к отправке уведомления по сети.

Если вы хотите уведомить удаленный сервер о том, что вы сделали передачу данных, вам нужно будет отправить им дейтаграмму с уведомлением об этом.

Если вы пытаетесь передать файл через UDP, имейте в виду, что UDP-пакеты не гарантируются, и они не гарантируются для получения в том же порядке, в каком они передаются! (То есть они могут быть сброшены или переупорядочены сетью.)

+0

Да, я знаю, что они не гарантированно прибудут, поэтому я было просто интересно, есть ли более хороший способ написать эту часть кода. Как насчет второй части моего вопроса? В принципе, сейчас у меня есть 10 секунд для запуска отправителя, иначе соединение истекает. Я знаю, что теоретически это должно произойти, но есть ли способ начать передачу после запуска Sender? –

+1

@JohnnyBravo Если вы хотите иметь возможность принимать входящие соединения, обнаруживать удаленное закрытие и избегать потери пакетов и переупорядочения, ** использовать TCP-сокеты **. Их цель - решить эти проблемы для вас. – duskwuff

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