У меня есть два беспроводных компьютера, подключенных к беспроводному маршрутизатору N.Каждый из этих компьютеров подключен со скоростью 108-150 Мбит / с.
Теоретически, я должен быть в состоянии передавать со скоростью 13,5 МБ / с до 18,75 МБ / с, при абсолютных лучших условиях.
Первый компьютер (который отправляет) использует оченьбыстрый SSD, который составляет около 100 МБ / с, если я правильно помню.Загрузка ЦП также остается ниже 20%.
Отправлено 1960273535 байт (1,8 ГБ) в 656367 мс.Это 2,8 МБ / с (22 из 108 мегабит).Когда я открываю диспетчер задач, я вижу, что используется только 25-27% сетевого подключения.
Я ищу любые идеи, предложения или улучшения, которые могут ускорить передачу (по сети).Я думал о буферизации файла с диска в потоке и отправке буферизованных данных из другого потока, но я не уверен, что это хорошая идея.Вот SSCCE:
Хост:
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: после изменениятаймер, оказывается, он передавал со скоростью 3 МБ / с через WiFi.Я ненавижу "теоретическую" пропускную способность.Когда я покупаю что-то, я хочу знать, что это НАСТОЯЩАЯ производительность.Оказывается, код действительно ограничен скоростью WiFi.Я все еще открыт для предложений.
Редактировать 3: После запуска программы в локальной сети 100 Мбит / с ей удалось передать файл со скоростью 11,8 МБ / с.Это очень хорошо, учитывая, что максимальная скорость передачи составляет 12,5 МБ / с.