Как передать файл в клиент-серверное Java-приложение - PullRequest
0 голосов
/ 25 сентября 2010

Я сейчас работаю над домашним заданием и полностью застрял.Я на последнем вопросе, и я просто не могу понять, как выполнить последнее задание.Ниже приведены задачи, которые мне пришлось выполнить:


  1. Клиент должен сохранить файл в подкаталоге client в домашнем каталоге.

  2. Проверьте вашу программу.Убедитесь, что он работает с двоичными файлами, а не только с текстовыми файлами.Убедитесь, что он работает, когда обе программы находятся на одной машине, а также когда они разделены по сети.


Пока я запускаю сервер, он спрашивает, какой порт Iхочу использовать.Затем я запускаю клиент, и он спрашивает, какой IP и порт использовать.Сервер немедленно отправляет список файлов в папку «сервер» домашнего каталога.Затем я отвечаю клиенту номером файла, который хочу загрузить.Вот где я застреваю.Я не могу найти информацию о том, как это сделать.Итак, как вы можете видеть в моем коде, размещенном ниже, я пытаюсь использовать FileInputReader для преобразования файла в массив байтов.Затем я отправляю это клиенту.Затем я пытаюсь FileOutputReader получить массив байтов в файл.Но я не могу найти правильные методы для этого, или даже если я делаю это правильно.

CLIENT

        int i = 0;
        while(i < 1000){
        String modifiedSentence = inFromServer.readLine();
        System.out.println("From Server: " + modifiedSentence);
        i++;
        }

        while(j < 1000) {
        int byteString = inFromServer.read();
        ArrayList<byte[]> bytes = new ArrayList<byte[]>();
        bytes.add(byteString);
        }
        Integer byteInt = new Integer(byteString);
        FileOutputStream fo = new FileOutputStream(System.getProperty("user.home")+ "/client/text.txt");
        fo.write(byteInt.byteValue());

    }
}

SERVER

            byte[] bytes = new byte[1024];
            FileInputStream fi = new FileInputStream(file.toString() + fileArray[userChoiceInt]);
            fi.read(bytes, 0, 1024);
            outToClient.write(bytes, 0, 1024);

        }
    }
}

Если бы кто-нибудь мог предложить какой-либо совет или правильные классы или методы для использования, я был бы признателен.

Заранее спасибо.

Ответы [ 4 ]

1 голос
/ 01 октября 2010

Не портя целиком, вот несколько советов.

Этого легко добиться, используя Socket (сервер и клиент). Использование byte [] для передачи файла (ов) гарантирует, что ваша программа будет работать как с ascii, так и с двоичными файлами.

Другой подход заключается в использовании сборки в Remote Method Invocation (RMI). Я не передавал файл с использованием этого подхода, но уверен, что это возможно.

И если вы не знали, получение домашнего каталога пользователя выполняется с помощью следующего вызова: System.getProperty ("user.home");

0 голосов
/ 25 сентября 2010

Если вы можете использовать для этого библиотеку IO, я бы предложил Netty или Mina.Вот несколько примеров netty: http://jboss.org/netty/documentation.htmlДаже если вы не можете использовать библиотеку, это может быть полезно для изучения того, как все делается.

0 голосов
/ 26 сентября 2010

Вы, вероятно, не должны спрашивать, как делать домашнюю работу в классе на таких веб-сайтах.Это не подходит.Ваш сервер выглядит в основном хорошо.Ваша программа будет читать только файлы размером до 1024 байт.Вы должны посмотреть на java.io.File более подробно.Существует метод длины, который можно использовать для определения длины файла, чтобы вы знали, сколько нужно отправить.

0 голосов
/ 25 сентября 2010

Вы можете взглянуть на этот учебник от Sun (Oracle). Это должно дать вам базовое понимание сокетов.

Однако я замечаю, что на стороне клиента вы повторяете определенное количество раз (1000), что не очень хорошая идея, поскольку, как правило, вы не знаете размер файла, который нужно отправить Должен показать это и как внести соответствующие изменения. Кроме того, вы продолжаете создавать структуры внутри цикла, поэтому вы теряете всю полученную информацию, кроме создания новых структур данных каждый раз, что неэффективно.

Что вам нужно сделать, это переместить инициализацию структур из-за пределов цикла. Кроме того, в случае переменной modifiedSentence вы можете изменить ее со строки на StringBuilder .

...