#1 17.11.07 16:49
[java] Проблема с отправкой файла клиенту
Дело в следующем - Клиент отправляет запрос серверу на получение файла, сервер проверяет наличие данного файла и если его найдет отправляет его.
Client
Код::
fis_out = new FileOutputStream("./trans_in/"+name);
f(file_size < path_size) path_size = file_size;
change_size = file_size;
byte[] path_buffer = new byte[path_size];
int read;
while(change_size > 0)
{
read = in_stream.read(path_buffer);
fis_out.write(path_buffer, 0, read);
change_size -= read;
full_size += read;
if(change_size < path_size)
{
path_buffer = new byte[change_size];
path_size = change_size;
}
}Server
Код::
if(real_fileSize < real_fileSize) path_size = real_fileSize;
change_size = real_fileSize;
byte[] path_buffer = new byte[path_size];
int read;
while(change_size > 0)
{
read = fis_in.read(path_buffer);
full_size += read;
cn.out_stream.write(path_buffer); //<<<< Выскакивает исключение
cn.out_stream.flush();
change_size -= path_size;
if(change_size < path_size)
{
path_buffer = new byte[change_size];
path_size = change_size;
}
}// исключение
java.net.SocketException: Software caused connection abort: socket write error
at java.net.SocketOutputStream.socketWrite0(Native Method)
P.S. Интересная особенность - если сделать передачу в обратном направлении то все работает без проблем
Подскажите пожалуйста в чем может быть проблема??? Заранее благодарен
Offline
#2 18.11.07 10:25
Re: [java] Проблема с отправкой файла клиенту
не совсем понятно что тут происходит по приведенному коду,
как вариант может быть что у клиента выскакивает исключение, а у сервера socket write error уже как следствие закрытого сокета.
зачем каждый раз перевыделять место для буффера в куче jvm для передачи куска данных ? лучше один раз выделить буфер килобайта на 4 и такими порциями его и передавать.
Исправлено ZiF (18.11.07 10:29)
Offline
#3 18.11.07 17:46
Re: [java] Проблема с отправкой файла клиенту
Начал проверять stream у клиента и сервера и оказалось что на стороне клиента (принимающего файл) не был определен
in_stream = socket.getInputStream();
Про буфер
//Задаю статически размер буфера...
int path_size = 128 * 1024;
Я его переопределяю только когда размер отстатка передаваемого файла оказался меньше чем path_size (происходит только 1 раз в конце).
// Файл читаю по размеру буфера и отправляю
Спасибо за совет... несколько раз смотрел не замечал этого косяка... )))
Offline

