2013-06-16 2 views
3

Здравствуйте и благодарите заранее за то, что нашли время для чтения. Я пытаюсь разработать простую программу передачи файлов Java с использованием TCP. До сих пор с использованием моих клиентских и серверных классов мне удалось добавить к нему рабочий метод загрузки (загрузить файл на компьютер, на котором работает сервер).Приложение для передачи файлов Java TCP

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

Для сервера и клиента я использую специальную папку по умолчанию (C:/Sharedfolder в этом случае). В настоящее время я задаю следующие вопросы:

  1. В моем текущем коде сервера файлы, которые загружаются к нему, переименовываются в «новый файл». Как я могу заставить это изменить имя файла на что-то вроде «oldfile_new» (будучи oldfile именем фактического исходного файла)?
  2. Используя мой текущий код сервера ниже, могу ли я создать клиентский класс для загрузки файла с сервера, который будет работать с ним? И как мне это сделать? Часть загрузки для меня имела смысл, но я все еще пытаюсь выяснить файлы для загрузки/записи с сервера.
  3. В настоящее время я использую предопределенный IP-адрес хоста, но в конечном итоге мне нужно будет изменить приложение, чтобы клиент отправил широковещательную рассылку UDP, чтобы найти сервер в частной сети. Может ли кто-нибудь указать мне в любом направлении, как это сделать?

Мой текущий код сервера выглядит следующим образом:

public class Server { 

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

    ServerSocket serverSocket = null; 

    try { 
     serverSocket = new ServerSocket(4555); 
    } catch (IOException ex) { 
     System.out.println("Can't setup server on this port number.\n"); 
    } 

    Socket socket = null; 
    InputStream is = null; 
    OutputStream fos = null; 
    BufferedOutputStream bos = null; 
    int bufferSize = 0; 
    System.out.println("Ready..."); 

    try { 
     socket = serverSocket.accept(); 
    } catch (IOException ex) { 
     System.out.println("Can't accept client connection.\n"); 
    } 

    try { 
     is = socket.getInputStream(); 

     bufferSize = socket.getReceiveBufferSize(); 
     System.out.println("Buffer size: " + bufferSize); 
    } catch (IOException ex) { 
     System.out.println("Can't get socket input stream.\n"); 
    } 

    try { 
     fos = new FileOutputStream("C:\\Sharedfolder\\newfile"); 
     bos = new BufferedOutputStream(fos); 

    } catch (FileNotFoundException ex) { 
     System.out.println("File not found.\n"); 
    } 

    byte[] bytes = new byte[bufferSize]; 

    int count; 

    while ((count = is.read(bytes)) > 0) { 
     bos.write(bytes, 0, count); 
    } 

    bos.flush(); 
    bos.close(); 
    is.close(); 
    socket.close(); 
    serverSocket.close(); 

} 

}

Любая помощь будет оценена. Спасибо :)

+0

Вам не нужно BufferedInput/OutputStream, если вы уже читаете/пишите большой байт []. Загрузка - это то же самое, что и загрузка, единственная разница заключается в том, какой конец отправляется и какой конец получает. Код в основном тот же. –

+0

Спасибо за ответ. Будет ли часть загрузки требовать от меня добавить что-то в класс сервера? Или изменения будут сделаны только на стороне клиента? Меня смущает сервер, работающий на фоне. – Jaqualembo

+0

Единственное различие между клиентом и сервером заключается в том, кто создал соединение, после чего у вас есть Socket, который выглядит одинаково с обоих концов. Я предлагаю вам извлечь код для отправки файла и другой способ получения файла. Разница в том, что сервер будет отправлять вместо клиента и клиент будет получать вместо отправки. Тот факт, что процесс работает в фоновом режиме, не должен иметь никакого значения. Клиент тоже может быть в фоновом режиме. –

ответ

1

Есть много инструментов, которые уже делают это, но это хорошее учебное упражнение.

Как правило, вы должны не только передавать данные, но и некоторую информацию о самом файле:

  1. Отправить имя файла от сервера к клиенту
  2. Отправить размер файла от сервера к клиенту
  3. Отправьте данные файла клиенту. Клиент может использовать размер, полученный на шаге, для расчета прогресса
  4. Отправляйте время изменения файла файла с сервера на клиент. CLient печатает полученный файл с модным временем

Все эти вещи могут быть отправлены через созданные вами потоковые объекты, вы должны быть уверены, что последовательность событий между клиентом и сервером верна.

1

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

вопрос 1: для получения имени файла с клиентской стороны вам необходимо перенести имя файла на сервер перед передачей данных файла.

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

public static boolean send(FileInputStream fis,OutputStream os) throws IOException, InterruptedException 
{ 
    Thread.currentThread().sleep(1000); 
    while(true) 
     { 
      int read=0; 
     if(fis!=null) 
      read=fis.read(buf); 
     byte[] result=new byte[read]; 
     //System.out.println(read); 
     // os.write(buf,0,read); 

     System.arraycopy(buf, 0, result,0, read); 
      os.write(result); 
      if(read < BUFFER_SIZE) 
      { 
       //System.out.println("服务器向客户端发送read="+read); 
      break; 
      } 
     }//while 
    fis.close();  
    return true; 
} 

В функции fis - это поток файлов, который необходимо отправить. ОС является выходным потоком, который получает из гнезда, как:

s = new ServerSocket(6868); 
socket= s.accept(); 
os=socket.getOutputStream(); 

вопрос 3: Вы должны установить IP-адрес, номер порта и протокол тип (TCP/UDP) в качестве аргументов главной функции. Таким образом, вы можете просто задать свои аргументы, а не изменять исходный код, чтобы ваше приложение выполнялось в другом направлении, как вы хотите.

Это то, что я знаю. Надеюсь, что он может вам помочь.

Смежные вопросы