Передача файлов с клиента на сервер с использованием TCP - PullRequest
0 голосов
/ 20 июля 2011

Привет всем, я делаю школьный проект и мне нужно сделать TCP Сервер / Клиент для передачи файлов с клиента на Сервер с использованием протокола TCP.

Я уже знаю, как заставить TCP сервер и клиент отправлять сообщения и объекты.

Что мне нужно, это:

  1. Пользователь выбирает файл из предопределенного каталога
  2. Затем он может набрать send-file.ext, чтобы отправить файл на сервер Сервер должен
  3. получить файл от клиента
  4. Сохранить файл в предопределенном каталоге

Как мне это сделать? Если я получаю файл с жесткого диска пользователя, как мне превратить этот файл в байты, а затем отправить на сервер. Откуда сервер знает, что это файл, и сохраняет файл с его оригинальным именем?

Thanx

Ответы [ 2 ]

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

Первое, что вам нужно сделать, это определить протокол.Например ...

  1. Каждое соединение с сервером должно представлять один файл.
  2. После того, как соединение установлено, клиент должен передать имя файла в первой строке.
  3. Затем клиент должен передать размер файла (в байтах) во второй строке.
  4. Затем клиент должен отправить содержимое файла.
  5. Наконец, соединение должнобыть выключенным.

Теперь вы должны выполнить кодирование для клиента.Вы можете прочитать содержимое файла, используя FileInputStream .Затем отправьте метаданные и содержимое через сокет, используя OutputBuffer в сокете.

Наконец, сервер.Когда клиент подключается, вы знаете, какими будут первые две строки.Итак, прочитайте в первой строке и создайте новый файл на основе имени файла.Затем прочитайте во второй строке.Наконец, считывает X количество байтов из сокета и записывает эти байты в файл , где X - размер в байтах из второй строки.

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

0 голосов
/ 20 июля 2011

Используйте ObjectOutputStream для отправки экземпляра файла через сокет и File.getName для получения имени файла.Файл Сериализуемый , поэтому вам не нужно преобразовывать экземпляр в байты.См. этот пример для получения дополнительной помощи.

//client
    String filename = "";
    File f = new File(filename);
    Socket sock = new Socket();
    ObjectOutputStream oos = new ObjectOutputStream(sock.getOutputStream());
    oos.writeObject( f );

    //server
    ObjectInputStream ois = new ObjectInputStream(sock.getInputStream());
    File f = (File)ois.readObject();
    String filename = f.getName();
...