Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Передача файлов по сети (Java) (http://forum.oszone.net/showthread.php?t=87819)

EvgeniyQQQ 30-07-2007 17:32 620524

Передача файлов по сети (Java)
 
Добрый день! Пишу две программки (клиент и серверок на языке 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 621337

Описанная выше проблема была решена путём по байтной передаче файла.

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

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

EvgeniyQQQ 17-11-2008 14:19 954866

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

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

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


Время: 23:44.

Время: 23:44.
© OSzone.net 2001-