Я попытался реализовать клиент / сервер TFTP.В соответствии с RFC 1350 я получил все правильно, единственное, чего сейчас не хватает, это подтвердить каждый пакет, который получает тот, кто его получает, будь то клиент или сервер.
- Сервер отправляет пакет дейтаграммы
- Клиент получает пакет дейтаграммы и отправляет обратно сообщение ACK («подтвердить») в пакете
- Сервер отправляет следующий пакет
Если Клиент не отправляет 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();
Я только изучаю сетевое программирование, поэтому буду благодарен за любые предложения или примеры кода.