2015-01-14 1 views
0

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

Есть 2 программы. Сервер и клиент имеют два класса: «Загрузка и выгрузка».

public class Download implements Runnable{ 

     public ServerSocket server; 
     public Socket socket; 
     public int port; 
     public String saveTo = ""; 
     public InputStream In; 
     public FileOutputStream Out; 

     public Download(String saveTo){ 
      try { 
       server = new ServerSocket(1544); 
       port = 1544; 
       this.saveTo = saveTo;    
      } 
      catch (IOException ex) { 
       System.out.println("Exception [Download : Download(...)]"); 
      } 
     } 

     @Override 
     public void run() { 
      try { 
       socket = server.accept(); 
       In = socket.getInputStream(); 
       Out = new FileOutputStream(saveTo); 
       byte[] buffer = new byte[1024]; 
       int count; 
       while((count = In.read(buffer)) >= 0){ 
        Out.write(buffer, 0, count); 
       } 
       Out.flush(); 
       if(Out != null){ Out.close(); } 
       if(In != null){ In.close(); } 
       if(socket != null){ socket.close(); } 
      } 
      catch (Exception ex) { 

       ex.printStackTrace(); 
      } 
     } 
    } 

и класс загрузки:

public class Upload implements Runnable{ 
    public String addr; 
    public int port; 
    public Socket socket; 
    public FileInputStream In; 
    public OutputStream Out; 
    public File file; 
    public Upload(String addr, int port, File filepath){ 
     super(); 
     try { 
      file = filepath; 
      socket = new Socket("127.0.0.1",1545); 
      Out = socket.getOutputStream(); 
      In = new FileInputStream(filepath); 
     } 
     catch (Exception ex) { 
      System.out.println("Exception [Upload : Upload(...)]"); 
     } 
    } 
    @Override 
    public void run() { 
     try {  
      byte[] buffer = new byte[1024]; 
      int count; 

      while((count = In.read(buffer)) >= 0){ 
       Out.write(buffer, 0, count); 
      } 
      Out.flush(); 
      if(In != null){ In.close(); } 
      if(Out != null){ Out.close(); } 
      if(socket != null){ socket.close(); } 
     } 
     catch (Exception ex) { 
      ex.printStackTrace(); 
     } 
    } 
} 

А в классе сервера:

File myFile = new File("temp"); 
Upload upl = new Upload("temp", 1544,myFile) 
fileThreadSend = new Thread(upl); 
fileThreadSend.start(); 

и в классе клиента:

Download dwn = new Download("temp"); 
Thread fileThread = new Thread(dwn); 
fileThread.start(); 

Проблема пробегов, но это Безразлично» t передать весь файл иногда он передает только 9kb, а иногда и 20 MBS. что не так? Я попытался выполнить поиск, но не нашел подходящего решения. Заранее спасибо

+0

Возможно, это опечатка - но это не ваш класс загрузки, который всегда создает сокет на порту 1545 и игнорирует переданный параметр порта? Если это не опечатка - вы можете загрузить в другой порт, чем вы думали. Для чего это стоит - код отлично переносится на моей машине (клиент и сервер, работающий на одном компьютере), хотя он не закрывает сокеты чисто при ошибке. Интересно, может ли что-то прервать один из потоков? Вы тестируете клиент и сервер на одном компьютере или разные? –

+0

Нет, вы правы, это опечатка, в полной программе это один и тот же порт с обеих сторон. Я тестирую на той же машине. – user3538203

+0

OK - хорошо - я не могу сделать это неудачным в этом сценарии (т. Е. Не может воспроизвести сбой). Получаете ли вы какие-либо исключения, когда копируется только часть файла? Есть ли причина, по которой вы хотите реализовать собственное клиентское серверное решение через собственную реализацию Thread, работающую напрямую с сокетами? –

ответ

0

Не беспокоили и использовать то, что JDK может предложить:

Подробнее here. И не забудьте использовать try-with-resources.

Также не используйте Thread и используйте вместо этого ExecutorService.

+0

вы могли бы предоставить очень короткий пример использования копии. Thant был бы очень благодарен – user3538203

+0

Эту ссылку не предоставляет вам информация об API? – fge

+0

Downvoter, пожалуйста, объясните – fge