Повышение эффективности передачи файлов Java

У меня есть два беспроводных компьютера, подключенных к беспроводному маршрутизатору N. Каждый из этих компьютеров подключен на скорости 108–150 Мбит / с.

Теоретически я должен иметь возможность передавать данные со скоростью от 13,5 МБ / с до 18,75 МБ / с при наилучших условиях.

Первый компьютер (который отправляет) использует очень быстрый SSD, который составляет около 100 МБ / с, если я правильно помню. Использование ЦП также остается ниже 20%.

Он отправил 1960273535 байт (1,8 ГБ) за 656367 мс. Это 2,8 МБ / с (22 из 108 мегабит). Когда я открываю диспетчер задач, я вижу, что используется только 25–27% сетевого подключения.

Я ищу любые идеи, предложения или улучшения, которые могут ускорить передачу (по сети). Я думал о буферизации файла с диска в потоке и отправке буферизованных данных из другого потока, но я не уверен, что это хорошая идея. Вот SSCCE:

Host:

import java.io.*;
import java.net.*;


public class Host {


    public static void main(String[] args) throws IOException {


        ServerSocket servsock = new ServerSocket(15064);
        Socket sock = servsock.accept();
            long time = System.currentTimeMillis();

        OutputStream out = sock.getOutputStream();
        FileInputStream fileInputStream = new FileInputStream("C:\\complete.rar");

        byte [] buffer = new byte[64*1024]; 
        int bytesRead = 0;
        long totalSent = 0;

        while ( (bytesRead = fileInputStream.read(buffer)) != -1)
        {
            if (bytesRead > 0)
            {   
                out.write(buffer, 0, bytesRead);
                totalSent += bytesRead;
                System.out.println("sent " + totalSent);
            }   
        }

        sock.close();

        System.out.println("Sent " + totalSent + " bytes in "
                + (System.currentTimeMillis() - time) + "ms.");

    }
}

Клиент:

import java.io.*;
import java.net.*;

public class Client {

    public static void main(String[] args) throws Exception {
        Socket sock = new Socket("127.0.0.1", 15064);
        InputStream in = sock.getInputStream();
        FileOutputStream fileOutputStream = new FileOutputStream("output.rar");

        byte [] buffer = new byte[64*1024]; 
        int bytesRead = 0;

        while ( (bytesRead = in.read(buffer)) != -1)
            fileOutputStream.write(buffer, 0, bytesRead);
        sock.close();
        fileOutputStream.close();
    }
}

Редактировать: Я попытался подключить сетевой диск и отправить файл через него, и Windows сделала еще хуже - 2,35 МБ / с. Согласно этой статье http://tinyurl.com/634qaqg отображение сетевого диска быстрее, чем FTP, и у меня также нет времени, чтобы продолжать играть и настраивать FTP-сервер.

Edit2: После изменения таймера оказалось, что передача по WiFi происходила со скоростью 3 МБ / с. Ненавижу "теоретическую" пропускную способность.Когда я что-то покупаю, я хочу знать, что это НАСТОЯЩАЯ производительность. Оказывается, код действительно ограничен скоростью Wi-Fi. Тем не менее, я все еще открыт для предложений.

Редактировать 3: После запуска программы в локальной сети 100 Мбит / с ей удалось передать файл со скоростью 11,8 МБ / с. Это неплохо, учитывая, что максимальная скорость передачи составляет 12,5 МБ / с.

6
задан user207421 21 September 2011 в 23:13
поделиться