Реализация Java TFTP с помощью std libs - как проверить пакеты? - PullRequest
0 голосов
/ 20 марта 2012

Я попытался реализовать клиент / сервер TFTP.В соответствии с RFC 1350 я получил все правильно, единственное, чего сейчас не хватает, это подтвердить каждый пакет, который получает тот, кто его получает, будь то клиент или сервер.

  1. Сервер отправляет пакет дейтаграммы
  2. Клиент получает пакет дейтаграммы и отправляет обратно сообщение ACK («подтвердить») в пакете
  3. Сервер отправляет следующий пакет

Если Клиент не отправляет ACK в течение, скажем, 20 секунд, то сервер передаетэтот же пакет снова, пока не получит ACK от Клиента.

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

Сервер:

private void receiveData() throws Exception
{
    Calendar cal = Calendar.getInstance();
    SimpleDateFormat prefix = new SimpleDateFormat(date_format);
    String date = prefix.format(cal.getTime()).toString();

    DatagramPacket receiveData = new DatagramPacket(incomingData, incomingData.length);
    OutputStream fos = new FileOutputStream(new File(date+data));

    while(true)
    {
        clientSocket.receive(receiveData);
        if(receiveData.getLength() == 512)
        {
            fos.write(receiveData.getData());
        } else {
            fos.write(receiveData.getData(), receiveData.getOffset(), receiveData.getLength());
            break;
        }
    }
    fos.close();
    clientSocket.close();
}

Клиент:

    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) {
        data.setLength(a);
        serverSocket.send(data);
        Thread.sleep(5);
    }
    fis.close();

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

Ответы [ 2 ]

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

Проблема решена:

  1. sendData () отправляет пакет
  2. receiveData () получает пакет и отправляет его обратно
  3. sendData () проверяет, совпадает ли пакет с отправленным
  4. sendData () если он отправляет следующий или снова передает тот же
0 голосов
/ 20 марта 2012
  1. Соберите необходимые данные в DatagramPacket. Поскольку это ответ, лучше всего использовать входящий DatagramPacket. Таким образом, в нем уже есть целевой адрес.

  2. Отправь.

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