2016-03-24 45 views
-3

基本上我想要做的是有一些服務器代碼在任何機器上運行,並能夠訪問和下載該機器上的所有文件和文件夾。我們已經附上我的代碼在底部但這裏是我的,我所知道的,並在我卡:我試圖做一個Java文件服務器

編輯: 我已經告訴我的問題是過於抽象,不明確。我已經想出瞭如何讓我的文件列表。現在我需要在'payLoad'字符串中列出它們。

  • 我知道我硬編碼的文件瀏覽器。它只是幫助我開始視覺化。它說'有些文件'和'一些文件夾',因爲那是我希望他們去的地方。
  • 我已經將文件加載到數組中,因爲它們是動態的。現在我要將數組列表加載到HTML表中。
  • 我知道有HTTP和URL的事情,我要做的,像GET和POST實際下載的文件,但我仍然需要幫助上手

    import java.net.*; 
    import java.io.*; 
    import java.util.Date; 
    import java.awt.Desktop; 
    import java.net.URI; 
    
    class Main { 
        public static void main(String[] args) throws Exception { 
        File folder = new File("/Users/DeAndre"); 
        File[] listOfFiles = folder.listFiles(); 
        int c = 0; 
        // Listen for a connection from a client 
        ServerSocket serverSocket = new ServerSocket(1234); 
        if (Desktop.isDesktopSupported()) 
         Desktop.getDesktop().browse(new URI("http://localhost:1234")); 
        else 
    
         System.out.println("Please direct your browser to http://localhost:1234."); 
         while(true) { 
          Socket clientSocket = serverSocket.accept(); 
          System.out.println("Got a connection!"); 
          PrintWriter out = new PrintWriter(clientSocket.getOutputStream(), true); 
          BufferedReader in = new BufferedReader(new InputStreamReader(clientSocket.getInputStream())); 
          String dateString = (new Date()).toGMTString(); 
          while(c<listOfFiles.length) { 
           String payload = "\t\t<table>\n" + 
             "\t\t<tr><td align=right>Current directory:</td><td>/some/path/</td></tr>\n" + 
             "\t\t<tr><td>\n" + 
             "\t\t<b>Folders:</b><br>\n" + 
             "\t\t<select id=\"folderList\" size=\"15\" style=\"width: 280px\" onchange=\"javascript:location.href=this.value;\">\n" + 
             "\t\t\t<option value=\"index.html?cd=..\">..</option>\n" + 
             "\t\t\t<option value=\"index.html?cd=somefolder\">somefolder</option>\n" + 
             "\t\t\t<option value=\"index.html?cd=anotherfolder\">anotherfolder</option>\n" + 
             "\t\t\t<option value=\"index.html?cd=yetanotherone\">yetanotherfolder</option>\n" + 
             "\t\t</select>\n" + 
             "\t\t</td><td>\n" + 
             "\t\t<b>Files:</b><br>\n" + 
             "\t\t<select id=\"fileList\" size=\"15\" style=\"width: 280px\">\n" + 
             "\t\t\t<option value=\"somefile.txt\">somefile.txt</option>\n" + 
             "\t\t\t<option value=\"somefile.txt\">" + listOfFiles[20].getName() + "</option>\n" + 
             "\t\t\t<option value=\"anotherfile.jpeg\">anotherfile.jpeg</option>\n" + 
             "\t\t</select>\n" + 
             "\t\t</td></tr></table>" + listOfFiles[1]; 
           c++; 
    
          for (int i = 0; i < listOfFiles.length; i++) { 
           if (listOfFiles[i].isFile()) { 
            System.out.println("File " + listOfFiles[i].getName()); 
           } else if (listOfFiles[i].isDirectory()) { 
            System.out.println("Directory " + listOfFiles[i].getName()); 
           } 
          } 
    
    
          // Receive the request from the client 
          String inputLine; 
          while ((inputLine = in.readLine()) != null) { 
           System.out.println("The client said: " + inputLine); 
           if (inputLine.length() < 2) 
            break; 
          } 
    
          //File Browser 
    
          // Send HTTP headers 
          System.out.println("Sending a response..."); 
          out.print("HTTP/1.1 200 OK\r\n"); 
          out.print("Content-Type: text/html\r\n"); 
          out.print("Content-Length: " + Integer.toString(payload.length()) + "\r\n"); 
          out.print("Date: " + dateString + "\r\n"); 
          out.print("Last-Modified: " + dateString + "\r\n"); 
          out.print("Connection: close\r\n"); 
          out.print("\r\n"); 
    
          // Send the payload 
          out.println(payload); 
          System.out.println("Done."); 
         } 
        } 
    } 
    } 
    

旁註。出於某種原因,人們忘記了help這個詞的定義,只是變得非常粗魯。請。我知道有很多我不知道,這就是爲什麼我想學習。我卡住了。正確的方向將是有益的。

+1

爲了得到一個明確的答案,你需要問一個具體問題。如果你想要一個代碼審查,那裏有另一個網站。這個論壇是針對明確的編程問題的明確答案,這些問題不是基於觀點的。本論壇不會試圖成爲所有人的全部事情。 –

+1

@PeterLawrey StackOverflow [不是論壇](http://meta.stackexchange.com/questions/92107/is-stack-overflow-a-forum) –

+0

@ cricket_007好點。 –

回答

2

如果你想在這裏學習是一個提示。不要將完整的邏輯實現爲單一方法。最好將一個大方法分成幾種方法,如

private void sendHttpHeaders(PrintWriter out, String payload, String dateString) { 
    System.out.println("Sending a response..."); 
    out.print("HTTP/1.1 200 OK\r\n"); 
    out.print("Content-Type: text/html\r\n"); 
    out.print("Content-Length: " + Integer.toString(payload.length()) + "\r\n"); 
    out.print("Date: " + dateString + "\r\n"); 
    out.print("Last-Modified: " + dateString + "\r\n"); 
    out.print("Connection: close\r\n"); 
    out.print("\r\n"); 
} 

這使代碼更具可讀性。提示:內聯註釋是創建新方法的一個很好的指示。

問候, 馬丁

+0

謝謝,但仍然讓我對我的主要問題感到困惑。這只是讓我的代碼更具可讀性。這只是一個編碼器的偏好?這是否使它更快? – FlameToAsh

+0

不,它並沒有讓它變得更快,但它更具可讀性,因此讓其他人閱讀起來更有趣。 –

相關問題