0

私の問題は、クライアントでdis.read()-1を返すことによって、実際にファイルを受け取らないことです。私が考えることができるのは、このセクションの前にPrintWriterBufferedReaderを使用しているため、dis.read()はすべてのデータがすでに受信されていると考えていることです。クライアントソケットはサーバからのデータを受信しません

クライアントコード:

public static void receiveFile(String serverAddress, int port, String fileName, String fileOut) throws IOException { 
    Socket client = new Socket(serverAddress, port); 
    client.setSoTimeout(5000); 
    PrintWriter out = new PrintWriter(client.getOutputStream(), true); 
    BufferedReader input = new BufferedReader(new InputStreamReader(client.getInputStream())); 

    try { 
     out.println("101|" + fileName + "\n"); 

     if (input.readLine().equals("201")) { 
      int br; 
      byte[] data = new byte[4096]; 

      DataInputStream dis = new DataInputStream(client.getInputStream()); 
      FileOutputStream fos = new FileOutputStream(fileOut); 

      while ((br = dis.read(data, 0, data.length)) != -1){ 
       fos.write(data, 0, br); 
      } 

      fos.close(); 
      dis.close(); 
     } 
    } catch (SocketTimeoutException ste) { 
     ste.printStackTrace(); 
     client.close(); 
    } 
} 

サーバコード:

private void sendFile(String filename, Socket client) throws IOException { 
    int br; 
    byte[] data = new byte[4096]; 
    PrintWriter out = new PrintWriter(client.getOutputStream(), true); 

    out.println("201\n"); 

    DataOutputStream dos = new DataOutputStream(client.getOutputStream()); 
    FileInputStream fis = new FileInputStream(MeshFS.properties.getProperty("repository") + filename); 

    while ((br = fis.read(data, 0, data.length)) != -1) { 
     dos.write(data, 0, br); 
     dos.flush(); 
    } 

    fis.close(); 
    dos.close(); 
} 

private String receiveRequest(Socket client) { 
    String requestPart; 
    String requestFull = ""; 
    try { 
     BufferedReader input = new BufferedReader(new InputStreamReader(client.getInputStream())); 

     while (((requestPart = input.readLine()) != null) && (requestFull.length() < 2048)) { 
      if (requestPart.equals("")) break; 
      requestFull = requestFull + requestPart; 
     } 

     return requestFull; 
    } catch (IOException ioe) { 
     return requestFull; 
    } 
} 

private void processRequest(String request, Socket out) { 

    if (request != null) { 
     try { 
      String[] requestParts = request.split("\\|"); 
      if (requestParts[0].equals("101")) {   //101:Get file 
       sendFile(requestParts[1], out); 

      } else { 
       badRequest(out, request); 
      } 
     } catch (Exception e) { 
      badRequest(out, request); 
      e.printStackTrace(); 
     } 
    } 
} 

    public void run() { 
     while (!Thread.interrupted()) { 
      try { 
       server.setSoTimeout(1000); 
       Socket client = server.accept(); 
       client.setSoTimeout(timeout); 
       processRequest(receiveRequest(client), client); 
       client.close(); 
      } catch (SocketTimeoutException ste) { 
      } catch (IOException io) { 
       io.printStackTrace(); 
      } 
     } 
     System.out.println("Socket closed"); 
} 

私は存在しないか、または含めることを忘れてる何かはありますか?何かを洗い流したり、何かをクリアしたりしていませんか?

+0

もっとコードを提供できますか?私はserversocketとの接続を受け入れる部分を見たいと思います –

+0

私はかなり多くをすべて含むように私のコードを更新しました。 –

答えて

1

さて、私は間違いを見つけたと思います。私はいくつかの実験を行い、複数のオブジェクトがそれらから読み込もうとすると、InputStreamの動作が奇妙であることを発見しました。お客様のケースでは、クライアントのreceiveFileメソッドのBufferedReaderDataInputStreamの可能性がありますが、同じinputStreamから読み取ろうとすると問題が発生します。私はDataInputStreamを使って最初の行を読むことをお勧めしますので、BufferedReaderを作成する必要はありません。 DataInputStream.readLine()メソッドは推奨されなくなりましたが、あなたのケースではまだうまくいくはずです。

クライアントreceiveFileを編集して、DataInputStreamを使って最初の行を読み取る方法を編集しました。それが動作することを願って!

public static void receiveFile(String serverAddress, int port, String fileName, String fileOut) throws IOException { 
    Socket client = new Socket(serverAddress, port); 
    client.setSoTimeout(5000); 
    PrintWriter out = new PrintWriter(client.getOutputStream(), true); 
    DataInputStream dis = new DataInputStream(client.getInputStream()); 

    try { 
     out.println("101|" + fileName + "\n"); 

     if (dis.readLine().equals("201")) { 
      int br; 
      byte[] data = new byte[4096]; 

      FileOutputStream fos = new FileOutputStream(fileOut); 

      while ((br = dis.read(data, 0, data.length)) != -1){ 
       fos.write(data, 0, br); 
      } 

      fos.close(); 
      dis.close(); 
     } 
    } catch (SocketTimeoutException ste) { 
     ste.printStackTrace(); 
     client.close(); 
    } 
} 
関連する問題