Войти

Показать полную графическую версию : Передача файлов по сети (Java)


EvgeniyQQQ
30-07-2007, 17:32
Добрый день! Пишу две программки (клиент и серверок на языке Java), одной из функций которых является передача файлов (от клиента к серверу). Читаю файл клиентом в переменную типа char и передаю его методом write(), который является методом класса BufferedWriter. Читаю из потока функцией read(), класса BufferedReader.
Проблема состоит в том, что когда я считываю 255 байт, передаю их по сети, выводимые в файл данные весят 270 байт. Откудато берутся 15 лишних байт. В начале файла появляется знак ?, в конце 14 символов форматирования (блокнот их отображает как пробелы). Выводя данные в файл, я указываю, что записываю 255 байт, но толку от этого нет.

Фрагмент кода клиента:
...

InputStream inputStream = new FileInputStream("C:\\example.xml");
InputStreamReader inputStreamReader = new InputStreamReader(inputStream,"UTF-8");

System.out.println("IP/MAC: ");
BufferedReader r = new BufferedReader(new InputStreamReader(System.in));
String str = r.readLine();
r.close();

Socket s = new Socket(str, 32000);

BufferedReader input = new BufferedReader(new InputStreamReader(s.getInputStream()));
BufferedWriter output = new BufferedWriter(new OutputStreamWriter(s.getOutputStream()));

char[] buf = new char[255];
int len = 0;
while ((len = inputStreamReader.read(buf, 0, buf.length)) > 0)
{
output.write(buf);
output.flash();
}

output.close();
inputStreamReader.close();

s.close();

...


Фрагмент кода сервера:
...

BufferedReader in = new BufferedReader(new InputStreamReader(incoming.getInputStream()));

char[] buf = new char[255];

OutputStream outputStream = new FileOutputStream("C:\\exampleCopyXML.xml");
//Приводим поток к потоку форматированного вывода
OutputStreamWriter outStreamWriter = new OutputStreamWriter(outputStream, "UTF-8");

int len = 0;

while (((len = in.read(buf))) > 0)
{
//Выводим в файл полученный пакет
outStreamWriter.write(buf,0,255);
}

in.close();
outStreamWriter.close();

...


Помогите, пожалуйста.

EvgeniyQQQ
01-08-2007, 14:57
Описанная выше проблема была решена путём по байтной передаче файла.

Возник ёще один вопросик. Может ли для одного процесса (приложения) быть открыто несколько портов.

Как я понимаю, порт (в данном случае) - это идентификатор процесса. Значит не может? Но очень надо.

EvgeniyQQQ
17-11-2008, 14:19
Добрый, день! Вопрос по поводу тех же сервера и клиента.
Клиент выполняет отправку файлов по сети по протоколу TCP. Сервер принимает эти файлики и выполняет дальнейшие действия.

Проблемка состоит в том, что если клиент пытается передать весь файл сразу, то у сервера выскакивает исключение... файлик не передаётся...
Поборол проблему установив размер передаваемого пакета в 1024 байт. То есть, клиент разбивает файл на пакеты размером 1024 байта или меньше. Передаёт первый пакет, ждёт ответа сервера, передаёт второй пакет и т.д. Проблема состоит в том, что чем меньше размер пакета, тем ниже скорость передачи. Та скорость, что получается при размере пакета 1024 байт явно меньше той, с которой передаются файлики при использовании стандартных средств Windows.
Хотелось бы разобраться.... что же происходит? И найти решение как оптимизировать программки.

Прошу помощи :)




© OSzone.net 2001-2012