Передача файлов через Socket в Java - PullRequest
0 голосов
/ 05 августа 2011

Я делаю Сетевую систему передачи файлов для передачи любого типа файла по сети в Java. Размер также может быть любым. Поэтому я использовал протокол UTF-8 для этой задачи.

Я предоставляю коды, которые я сделал, но проблема в том, что файл иногда передается без каких-либо проблем. Но иногда на принимающей стороне просто пропускается несколько килобайт данных, что фактически ограничивает правильность открытия файла mp3 / video / image. Я думаю, что проблема с БУФЕРОМ. Я не создаю никакого буфера, который, на мой взгляд, может пригодиться мне.

Я был бы очень признателен, если бы кто-нибудь смог помочь с этой проблемой, чтобы файл был полностью передан.

Клиентская сторона: --- >> Отправитель файла

Socket clientsocket = new Socket(host,6789);                        // host contains the ip address of the remote server
DataOutputStream outtoserver = new DataOutputStream(clientsocket.getOutputStream());
try
{
    int r=0;
    FileInputStream fromFile1 = new FileInputStream(path);                  // "path" is the of the file being sent.
    while(r!=-1)
    {   
         r = fromFile1.read();
         outtoserver.writeUTF(r+"");
    }
}
catch(Exception e)
{
    System.out.println(e.toString());
}
clientsocket.close();

Сторона сервера: --- >> Приемник файлов

ServerSocket welcome = new ServerSocket(6789);
Socket conn = welcome.accept();
try
{
    String r1 = new String();
    int r=0;
    FileOutputStream toFile1 = new FileOutputStream(path);                  // "path" is the of the file being received.
    BufferedOutputStream toFile= new BufferedOutputStream(toFile1);
    DataInputStream recv = new DataInputStream(conn.getInputStream());
    while(r!=-1)
    {   
        r1 = recv.readUTF();
        r = Integer.parseInt(r1);
        toFile.write(r);
    }
}
catch(Exception e)
{
    System.out.println(e.toString());
}

Ответы [ 3 ]

5 голосов
/ 05 августа 2011

Я не понимаю, почему вы кодируете двоичные данные в виде текста.

Простые сокеты могут без проблем отправлять и получать потоки байтов.Итак, просто прочитайте файл как байты с помощью FileInputStream и запишите байты в сокет как есть.

(Для записи, вероятно, вы отправляете от 3 до 5 байтов на каждый байт вводафайл. И вы читаете входной файл по одному байту в типе без какой-либо буферизации. Эти и другие ошибки, которые вы допустили, могут оказать существенное влияние на скорость передачи файла. Чтобы повысить производительность, достаточно просто прочитать и записать массивыбайт, используя размер буфера не менее 1 Кбайт.)


Я не уверен в этом, но я подозреваю, что причина того, что вы теряете некоторые данные, заключается в том, что вы не сбрасываете или не закрываете outtoserver перед тем, как закрыть сокет на отправляющем конце.

СЛЕДОВАТЬ ВВЕРХ

Я также заметил, что вы не очищаете / закрываете toFile на приемном конце,и это может привести к потере данных в конце файла.

1 голос
/ 05 августа 2011

Первая проблема, которую я вижу, это то, что вы используете DataInputStream и DataOutputStream.Они предназначены для чтения / записи примитивных типов Java (int, long и т. Д.), Они вам не нужны только для двоичных данных.

Другая проблема заключается в том, что вы не очищаете поток вывода файла- это может быть причиной потери байтов.

0 голосов
/ 05 августа 2011

Явный сброс может помочь ситуации.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...