Увеличение скорости передачи данных на простом TCP-клиенте / сокете - PullRequest
1 голос
/ 14 сентября 2011

У меня есть домашнее задание для создания простого механизма передачи данных с парой сокетов клиент-сервер TCP путем перенаправления стандартного ввода-вывода. У меня фактически это работает, но когда я пытаюсь передать большие файлы (скажем, ~ 5g), скорость резко замедляется. Я использую BufferedInputStream и BufferedOutputStream, и я думаю, что, возможно, есть некоторая оптимизация, которую я могу сделать там. Код для моего сервера:

private static final int BUF_SIZE = 2047;

public static void main(String[] args) throws IOException{
   /*
    * Attempt to parse command line arguments.
    * @require args[0] is an int
    */
   int port = 0;
   try {
       port = Integer.parseInt(args[0]);
   } catch(NumberFormatException e) {
       System.err.println("Port must be an integer in range 0 - 65535.");
       System.exit(-1);
   }

   /*
    * Bind server socket to specified port number and wait for request.
    * @require port >= 0 && port <= 65535
    */
   ServerSocket welcomeSocket = null;
   welcomeSocket = new ServerSocket(port);
   System.out.println("Now listening on port: " + port);

    /*
     * Accept connection from client socket.
     */
    Socket connectionSocket = null;
    connectionSocket = welcomeSocket.accept();
    System.out.println("Client made connection");

    BufferedInputStream input;
    BufferedOutputStream output;
    if(System.in.available() > 0) {
        input = new BufferedInputStream(System.in, BUF_SIZE);
        output = new BufferedOutputStream(
                connectionSocket.getOutputStream(), BUF_SIZE);
    } else {
        input = new BufferedInputStream(
                connectionSocket.getInputStream(), BUF_SIZE);
        output = new BufferedOutputStream(System.out, BUF_SIZE);
    }

    int place;
    while((place = input.read()) != -1)
        output.write(place);

    input.close();
    output.close();
    welcomeSocket.close();
    connectionSocket.close();
}

Код клиента по сути тот же. Я пытался использовать разные размеры буфера, в том числе по умолчанию (без указания размера буфера), но все они работают примерно с одинаковой скоростью. Какие-нибудь указатели на то, как я могу увеличить свою производительность?

Спасибо за ваше время!

Ответы [ 2 ]

6 голосов
/ 14 сентября 2011
while((place = input.read()) != -1)

Вы читаете по одному байту за раз из буфера. Затраты на вызов этого метода в миллионы раз довольно велики.

Я бы предложил прочитать более одного байта в буфер с другой версией (и записать так же):

public int read(byte[] b,
            int off,
            int len)

Пример:

byte[] myBuffer = new byte[BUF_SIZE];
while((place = input.read(myBuffer, 0, BUF_SIZE)) != 1)
    output.write(myBuffer, 0, place);
3 голосов
/ 14 сентября 2011

вы читаете и отправляете байт за один раз, что неэффективно, вам следует прочитать блоки данных (размер простоя будет размером аппаратного буфера диска).конечно, диск должен быть вашей бутылочной горлышкой, здесь нужно время, чтобы прочитать диск 5G.

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