0

Mein Problem ist, dass in meinem Client dis.read()-1 zurückgibt, wodurch es nie tatsächlich die Datei erhalten. Das einzige, woran ich denken kann ist, dass, weil ich einen PrintWriter und einen BufferedReader vor diesem Abschnitt verwende, der dis.read() denkt, dass alle Daten bereits empfangen worden sind.Client-Socket empfängt keine Daten vom Server

Client-Code:

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(); 
    } 
} 

Server-Code:

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"); 
} 

Gibt es etwas, das ich fehle oder vergessen zu schließen? Spüle ich nicht etwas auf oder räume ich nicht auf?

+0

könnten Sie mehr Code zur Verfügung stellen? Ich möchte den Teil sehen, wo Sie die Verbindung mit dem Server akzeptieren –

+0

Ich aktualisierte meinen Code, um so ziemlich alles zu enthalten, schauen Sie bitte. –

Antwort

1

Okay, ich denke, ich habe den Fehler gefunden. Ich machte einige Experimente und fand heraus, dass sich InputStream seltsam verhalten, wenn mehrere Objekte versuchen, von ihnen zu lesen. In Ihrem Fall ist es sehr wahrscheinlich die BufferedReader und DataInputStream in Ihrem Client receiveFile Methode, die das Problem verursacht, indem Sie versuchen, von derselben inputStream zu lesen. Ich schlage vor, mit der DataInputStream auch die erste Zeile zu lesen, so dass Sie keine BufferedReader erstellen müssen. Auch wenn die Methode DataInputStream.readLine() veraltet ist, sollte sie in Ihrem Fall dennoch gut funktionieren.

Ich bearbeitet die Clients receiveFile Methode, um die DataInputStream zu verwenden, um die erste Zeile zu lesen. Hoffe, es funktioniert!

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(); 
    } 
} 
Verwandte Themen