2014-02-19 2 views
0

Я делаю простую ftp-клиентскую/серверную программу, которая по команде из списков клиентов перечисляет файлы, сообщает текущий каталог, загружает файлы . Мой клиентский код отлично работает с тех пор Я уже тестировал его на рабочем сервере. Однако сервер, который я разработал, застревает в функции run() в строке String message = br.readline(); Если вместо этого я использую br.read(), то он работает, но мне нужна команда в виде строки, чтобы узнать, какой файл мне нужно загрузить, тогда как br.read() возвращает int. Вот мой код, я использовал потоки.br.readline() застрял во время работы br.read()

public class Myserver { 
static final int PortNumber = 108; 
static ServerSocket MyService; 
static Socket clientSocket = null; 
/** 
* @param args 
* @throws IOException 
*/ 
public static void main(String[] args) throws IOException { 
    File directory; 
    directory = new File(System.getProperty("user.home")); 
    try { 
      MyService = new ServerSocket(PortNumber); 
      String cd = directory.toString(); 
      System.out.println(cd); 
      System.out.println("Listening on " + PortNumber); 
      while(true) { 
      clientSocket = MyService.accept(); 
      Connecthandle a = new Connecthandle(clientSocket, directory); 
      a.run(); 
      } 
    } 
    catch (IOException e) { 
    System.out.println(e); 
    } 
} 

    static class Connecthandle extends Thread { 
     File Directory; 
     Socket clientsocket; 

     // Constructor for class 
     Connecthandle(Socket clients, File dir) { 
      clientsocket = clients; 
      Directory = dir; 
     } 

     // Works Fine 
     void listfiles() throws IOException { 
      String []Listfile = Directory.list(); 
      String send = ""; 
      for (int j = 0; j < Listfile.length; j++) { 
       send = send + Listfile[j] + ","; 
      } 
      DataOutputStream GoingOut = new DataOutputStream(clientsocket.getOutputStream()); 
      GoingOut.writeBytes(send); 
      GoingOut.flush(); 
      GoingOut.close(); 
     } 
     // Works Fine 
     void currentdirectory() throws IOException { 
      String cd = Directory.toString(); 
      String cdd = "resp," + cd; 
      System.out.println(cdd); 
      DataOutputStream GoingOut = new DataOutputStream(clientsocket.getOutputStream()); 
      GoingOut.writeBytes(cdd); 
      GoingOut.flush(); 
      GoingOut.close(); 
      System.exit(0); 
     } 

     void sendfiles(String fileName) { 
      try { 
      File nfile = new File(fileName); 
      DataOutputStream GoingOut = new DataOutputStream(clientsocket.getOutputStream()); 
      if ((! nfile.exists()) || nfile.isDirectory()) { 
       GoingOut.writeBytes("file not present"); 
      } else { 
      BufferedReader br = new BufferedReader(new FileReader(nfile)); 
      String line; 
      while ((line = br.readLine()) != null) { 
       line = br.readLine(); 
       GoingOut.writeBytes(line+"\n"); 
      } 
      GoingOut.flush(); 
      GoingOut.close(); 
      br.close(); 
      } 
      } catch (IOException e) { 
       System.out.println("Unable to send!"); 
      } 
     } 

     @SuppressWarnings("deprecation") 
     public void run() { 
      try { 
      DataInputStream comingin = new DataInputStream(clientsocket.getInputStream()); 
      InputStreamReader isr = new InputStreamReader(comingin, "UTF-8"); 
      BufferedReader br = new BufferedReader(isr); 
      System.out.println("here"); 
      // if (br.ready()) 
      String message = br.readLine(); // Code gets stuck here, if i use br.read() it works, but i need string output. 
      if (message.equals("listfiles\n")) { 
       listfiles(); 
      } else if (message.equals("pwd")) { 
       currentdirectory(); 
      } else if (message.contains("getfile,")) { 
       String fileName = new String(message.substring(8, message.length())); 
       sendfiles(fileName); 
      } 
      } catch (Exception e) { 
       e.printStackTrace(); 
      } 
      finally { 
       try { 
        clientsocket.close(); 
       } catch (IOException e) {} 
      } 
     } 
    } 

}

+0

Нет, не совсем. Я мог бы использовать .start(). – user3293371

+2

Что в файле, который вы отправляете? Помните, что 'readLine' ищет (1) текст и (2) новую строку. При отправке произвольных файлов использование 'byte []' почти всегда является лучшим вариантом, особенно когда вы можете использовать NIO. – chrylis

+0

В 'sendfiles' вы читаете две строки за раз, что вы, вероятно, не хотите делать. – Alex

ответ

0

Если ReadLine() блокирует и вы отправляете данные, вы не посылает символ новой строки.

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