Я работаю над приложением TFTP-сервера. Мне удалось обработать успешную передачу файлов с сервера на клиент, но по-другому прослушивается.IndexOutOfBoundException при чтении файла
Клиент вместо передачи всего файла просто закончил компилятор whit, не возвращая ошибок. Отладчик показывает исключение IOBE в отмеченном коде, ссылаясь на то, что массив вне диапазона.
Весь процесс передачи идет так:
- Клиент передает имя файла и запрошенная операция WRQ - Написать запрос
- Сервер получил пакет и определяет операцию, если WRQ это дает новый файл соответствующее имя ,
- Сервер теперь начинает выполнение getData(), пока не получит пакет < 512 indicatorg EOT
- Клиент сохраняет данные, которые он считывает из файла.
Код ключа:
Клиент:
private void sendWRQ() throws Exception
{
String rrq = "WRQ-" + data;
outgoingData = rrq.getBytes();
DatagramPacket output = new DatagramPacket(outgoingData, outgoingData.length, serverAddress, serverPort);
clientSocket.send(output);
//Thread.sleep(50);
sendData();
}
byte outgoingData = new byte[512];
private void sendData() throws Exception
{
DatagramPacket dataTransfer = new DatagramPacket(outgoingData, outgoingData.length, serverAddress, serverPort);
InputStream fis = new FileInputStream(new File(data));
int x;
while((x = fis.read(outgoingData,0,512)) != -1) // << Debugged gives IOBE
{
dataTransfer.setLength(x);
clientSocket.send(dataTransfer);
Thread.sleep(5);
}
fis.close();
}
Сервер:
private void listen() throws Exception
{
DatagramPacket incTransfer = new DatagramPacket(incomingData, incomingData.length);
serverSocket.receive(incTransfer);
clientAddress = incTransfer.getAddress();
clientPort = incTransfer.getPort();
String output = new String(incTransfer.getData());
if(output.substring(0, 3).equals("RRQ"))
{
File test = new File(output.substring(4));
responseData = output.substring(4);
if(test.exists())
{
sendResponse("Y");
} else {
sendResponse("N");
}
} else if (output.substring(0, 3).equals("WRQ"))
{
File test = new File(output.substring(4));
if(test.exists())
{
Calendar cal = Calendar.getInstance();
SimpleDateFormat prefix = new SimpleDateFormat(date_format);
String date = prefix.format(cal.getTime()).toString();
responseData = date + output.substring(4);
receiveData();
} else {
responseData = output.substring(4);
receiveData();
}
}
}
private void receiveData() throws Exception
{
DatagramPacket receiveData = new DatagramPacket(incomingData, incomingData.length);
OutputStream fos = new FileOutputStream(new File(responseData));
while(true)
{
serverSocket.receive(receiveData);
if(receiveData.getLength() == 512)
{
fos.write(receiveData.getData());
} else {
fos.write(receiveData.getData(), receiveData.getOffset(), receiveData.getLength());
break;
}
}
fos.close();
}
напечатайте 'rrq.getBytes()' и посмотрите, правильно ли это. не уверен, что 'String' правильно обрабатывает специальные символы. – vulkanino
Это правильно. проблема не здесь, эта часть отправляется и принимается, так как должна быть проблематичная часть, где я пометил ее в коде. –
вы не указали определение 'outgoingData', у него достаточно места для хранения 512 байтов? – vulkanino