2015-05-25 25 views
-1

在我的客戶端服務器應用程序中,當我嘗試從serverSide下載文件時,文件被下載;但是不能讀取標題信息,例如一些帶換行符的附加文本。正如你可以在我的服務器類中看到的,以下信息應該打印在客戶端。FileoutputStream在空行之後不輸出任何字符串(換行符)

outputToClient.printf("Status OK\r\nSize %d Bytes\r\n\r\nFile %s Download was successfully\r\n", 
            fileSize, filename); 

但它沒有。在打印\r\n之前只有fisrt字符串(Status OK),而不是\r\n之後的任何字符串。

我該如何解決?

我的完整代碼:

服務器端:

public class ServerSide { 

private BufferedReader inputFromClient; 
private PrintWriter outputToClient; 
private FileInputStream fis; 
private OutputStream os; 
private static final int PORT = 8000; 
private ServerSocket serverSocket; 
private Socket socket; 

public static void main(String[] args) { 
    int port = PORT; 
    if (args.length == 1) { 
     port = Integer.parseInt(args[0]); 
    } 
    new ServerSide(port); 
} 

private boolean fileExists(File[] files, String filename) { 
    boolean exists = false; 
    for (File file : files) { 
     if (filename.equals(file.getName())) { 
      exists = true; 
     } 
    } 
    return exists; 
} 

public ServerSide(int port) { 
    // create a server socket 
    try { 
     serverSocket = new ServerSocket(port); 
    } catch (IOException ex) { 
     System.out.println("Error in server socket creation."); 
     System.exit(1); 
    } 

    while (true) { 
     try { 

      socket = serverSocket.accept(); 
      outputToClient = new PrintWriter(socket.getOutputStream()); 
      inputFromClient = new BufferedReader(new InputStreamReader(socket.getInputStream())); 

      while (true) { 

       String request = inputFromClient.readLine(); 

       if (!request.startsWith("exit") && !request.startsWith("pwd") && !request.startsWith("list") && !request.startsWith("GET")) { 
        outputToClient.println("Wrong request\r\n" 
          + "\r\n"); 
       } else if (request.startsWith("exit")) { 
        break; 
       } else if (request.startsWith("pwd")) { 
        File file = new File(System.getProperty("user.dir")); 
        outputToClient.print("Status OK\r\n" 
          + "Lines 1\r\n" 
          + "\r\n" 
          + "Working dir: " + file.getName() + "\r\n"); 
       } else if (request.startsWith("list")) { 
        File file = new File(System.getProperty("user.dir")); 
        File[] files = file.listFiles(); 
        outputToClient.print("Status OK\r\n" 
          + "Files " + files.length + "\r\n" 
          + "\r\n" 
          + Arrays.toString(files).substring(1, Arrays.toString(files).length() - 1) + "\r\n"); 
       } else if (request.startsWith("GET")) { 
        String filename = request.substring(4); 
        File file = new File(System.getProperty("user.dir")); 
        File[] files = file.listFiles(); 

        if (fileExists(files, filename)) { 
         file = new File(filename); 
         int fileSize = (int) file.length(); 

         outputToClient.printf("Status OK\r\nSize %d Bytes\r\n\r\nFile %s Download was successfully\r\n", 
           fileSize, filename); 
         outputToClient.flush(); 

         try (FileInputStream fis = new FileInputStream(file)) { 
          os = socket.getOutputStream(); 
          byte[] buffer = new byte[(1 << 7) - 1]; 
          int bytesRead = 0; 

          while ((bytesRead = fis.read(buffer)) != -1) { 
           os.write(buffer, 0, bytesRead); 
          } 

         } 
         //os.close(); 
         // fis.close(); 
        } else { 
         outputToClient.print("Status 400\r\n" 
           + "File " + filename + " not found\r\n" 
           + "\r\n"); 
         outputToClient.flush(); 
        } 
       } 
       outputToClient.flush(); 
      } 
     } catch (IOException e) { 
      System.err.println(e); 
     } 

    } 
} 

}

客戶方:

public class ClientSide { 

private static Socket socket; 
private static PrintWriter outputToServer; 
private static BufferedReader inputFromServer; 
private static InputStream is; 
private static FileOutputStream fos; 
private static final int PORT = 8000; 
private static final String SERVER = "85.197.159.45"; 
boolean Connected; 
DataInputStream serverInput; 

public static void main(String[] args) throws InterruptedException { 
    String server = "localhost"; 
    int port = PORT; 

    if (args.length >= 1) { 
     server = args[0]; 
    } 
    if (args.length >= 2) { 
     port = Integer.parseInt(args[1]); 
    } 

    new ClientSide(server, port); 
} 

public ClientSide(String server, int port) { 

    try { 
     socket = new Socket(server, port); 
     serverInput = new DataInputStream(socket.getInputStream()); 
     outputToServer = new PrintWriter(socket.getOutputStream(), true); 
     inputFromServer = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     System.out.println("Client is connected! "); 
     Connected = true; 
     String line = null; 

     Scanner sc = new Scanner(System.in); 
     System.out.print("Type command: "); 

     while (sc.hasNextLine()) { 
      String request = sc.nextLine(); 

      if (request.startsWith("exit")) { 
       outputToServer.println(request); 
       System.out.println("Application exited!"); 
       //outputToServer.flush(); 
       break; 
      } else if (request.startsWith("pwd")) { 
       outputToServer.println(request); 
       outputToServer.flush(); 
      } else if (request.startsWith("list")) { 
       outputToServer.println(request); 
       outputToServer.flush(); 
      } else if (request.startsWith("GET")) { 
       System.out.print("\r\n"); 
       outputToServer.println(request); 
       outputToServer.flush(); 
      } 
      while (Connected) { 
       line = inputFromServer.readLine(); 
       System.out.println(line); 
       if (line.isEmpty()) { 
        Connected = false; 
        if (inputFromServer.ready()) { 
         System.out.println(inputFromServer.readLine()); 
        } 
       } 
       if (line.startsWith("Status 400")) { 
        while (!(line = inputFromServer.readLine()).isEmpty()) { 
         System.out.println(line); 
        } 
        break; 
       } 
       if (request.startsWith("GET")) { 
        File file = new File(request.substring(4)); 
        is = socket.getInputStream(); 
        fos = new FileOutputStream(file); 

        byte[] buffer = new byte[socket.getReceiveBufferSize()]; 
        serverInput = new DataInputStream(socket.getInputStream()); 
        //int bytesReceived = 0; 
        byte[] inputByte = new byte[4000]; 

        int length; 
        while ((length = serverInput.read(inputByte, 0, inputByte.length)) > 0) { 
         fos.write(inputByte, 0, length); 

        } 

        request = ""; 
        fos.close(); 

       } 
      } 
      System.out.print("\nType command: "); 
      Connected = true; 
     } 
     outputToServer.close(); 
     inputFromServer.close(); 
     socket.close(); 
    } catch (IOException e) { 
     System.err.println(e); 
    } 

} 
} 

回答

0

您應後的最終outputToClient.flush()

關閉輸出流
+0

謝謝,但它沒有幫助。與之前相同的問題。 – Munira

+0

你在哪裏放置了'outputToClient.close()'? –

+0

最後的outputToClient.flush() – Munira