br.readline()在br.read()工作时卡住了

时间:2014-02-19 17:10:08

标签: java networking

我正在制作一个简单的ftp客户端/服务器程序,它从客户端命令列出文件,告诉当前目录,下载文件 我的客户端代码工作正常,因为我已经使用工作服务器测试了它。但是我设计的服务器卡在了行消息(String message = br.readline();如果我使用br.read(),那么它工作,但我需要以字符串的形式命令知道我必须下载哪个文件,而br.read()返回int。这是我的代码,我使用了线程。

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) {}
             }
         }
     }

}

1 个答案:

答案 0 :(得分:0)

如果readLine()阻塞并且您正在发送数据,则表示您没有发送换行符。