2017-08-28 2 views
0

Ich stieß auf ein Problem im Zusammenhang mit I/O während der Entwicklung einer einfachen Anwendung, und ich bin mir nicht sicher, warum mein Code nicht richtig funktioniert. Ich nahm nur den Teil des Codes, der nicht funktioniert und machte ein einfaches Beispiel.Streams empfangen keine Daten nach der Verwendung von InputStream read()

Serverklasse

public class Server { 

    public static void main(String[] args) throws IOException { 

     ServerSocket serversocket = new ServerSocket(56700); 
     Socket socket = serversocket.accept(); 
     InputStream is = socket.getInputStream(); 
     BufferedReader br = new BufferedReader(new InputStreamReader(is)); 

     while (true) { 
      String line; 
      if ((line = br.readLine()) != null) { 

       System.out.println(line); 

       switch (line) { 
        case "line": 
         System.out.println(br.readLine()); 
         break; 

        case "file": { 

         try (FileOutputStream fos = new FileOutputStream(new File("file.txt"))) { 

          byte[] bytes = new byte[4096]; 

          int count; 
          while ((count = is.read(bytes)) > 0) { 
           fos.write(bytes, 0, count); 
          } 
         } 
         break; 
        } 
       } 
      } 
     } 
    } 
} 

Client-Klasse

public class Client { 

    public static void main(String[] args) throws IOException { 

     Socket socket = new Socket("localhost", 56700); 
     PrintWriter pw = new PrintWriter(socket.getOutputStream()); 

     pw.write("line\n"); 
     pw.write("line test\n"); 
     pw.flush(); 

     try (FileInputStream fis = new FileInputStream(new File("test.txt")); OutputStream fos = socket.getOutputStream()) { 

      pw.write("file\n"); 
      pw.flush(); 

      byte[] bytes = new byte[4096]; 
      int count; 
      while ((count = fis.read(bytes)) > 0) { 
       fos.write(bytes, 0, count); 
      } 

     } catch (IOException ex) { 
      System.out.println("Error sending the file."); 
     } 

     pw.write("\n"); 
     pw.write("line\n"); 
     pw.write("line test 2\n"); 
     pw.flush(); 

    } 
} 

Grundsätzlich habe ich einen Client, der Daten an einen Server sendet. Der Client verwendet , um eine Zeile vor den Daten von Interesse zu schreiben, um den Typ der gesendeten Informationen zu identifizieren: eine Textzeile oder eine Datei. Wie Sie sehen, liest der Server die Zeilen mit BufferedReader readLine() und die Bytes aus der Datei mit InputStream read(byte[] bytes). Der Client sendet zuerst eine Textzeile, dann Daten aus einer Datei als Bytes und schließlich eine Textzeile.

Die Sache ist, dass, nachdem die Datei erfolgreich vom Server gesendet und empfangen wurde, die Textzeile nicht empfangen wird. Ich habe überprüft und festgestellt, dass der BufferedReader diese Textzeile niemals empfängt. Wie Sie sehen können, schrieb ich eine \n, nachdem die Datei Daten geschrieben wurde, falls das das Problem war, aber es hat nicht funktioniert. Ich vermisse wahrscheinlich etwas, das mit dem Funktionieren dieser Ströme zusammenhängt.

Irgendeine Idee? Danke im Voraus.

Antwort

0

Das Problem in diesem Code:

try (FileInputStream fis = new FileInputStream(new File("test.txt")); OutputStream fos = socket.getOutputStream()) { 

    pw.write("file\n"); 
    pw.flush(); 

    byte[] bytes = new byte[4096]; 
    int count; 
    while ((count = fis.read(bytes)) > 0) { 
     fos.write(bytes, 0, count); 
    } 

} catch (IOException ex) { 
    System.out.println("Error sending the file."); 
} 

Sie verwenden try-finally mit OutputStream fos = socket.getOutputStream(), nach dem Austritt aus Try-finally-Block von Code, den Sie schließen socket.getOutputStream() programmieren, weil Anprobe schließlich immer close Methode in implizite finally Block aufrufen . Sie PrintWriter gleichen verwenden SocketOutputStream hier:

pw.write("\n"); 
pw.write("line\n"); 
pw.write("line test 2\n"); 
pw.flush(); 

Aber dieser Strom bereits geschlossen.

Versuchen Sie folgendes:

OutputStream fos = socket.getOutputStream() 
try (FileInputStream fis = new FileInputStream(new File("test.txt"))) { 

    pw.write("file\n"); 
    pw.flush(); 

    byte[] bytes = new byte[4096]; 
    int count; 
    while ((count = fis.read(bytes)) > 0) { 
     fos.write(bytes, 0, count); 
    } 

} catch (IOException ex) { 
    System.out.println("Error sending the file."); 
} 

pw.write("\n"); 
pw.write("line\n"); 
pw.write("line test 2\n"); 
pw.flush(); 
pw.close(); //closing PrintWriter and internal SocketOutputStream 

Es wird besser, wenn du Benutzer nur eine: Printwriter oder Output

Verwandte Themen