2017-08-28 2 views
0

J'ai rencontré un problème lié aux E/S lors du développement d'une application simple et je ne suis pas sûr de la raison pour laquelle mon code ne fonctionne pas correctement. Je n'ai pris que la partie du code qui ne fonctionne pas et fait un exemple simple.Flux ne recevant pas de données après l'utilisation de InputStream read()

Class Server

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

Classe Client

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

    } 
} 

Fondamentalement, j'ai un client qui envoie des données à un serveur. Le client utilise PrintWriter write(String str) pour écrire une ligne avant les données d'intérêt, pour identifier le type d'information envoyé: une ligne de texte ou un fichier. Comme vous le voyez, le serveur lit les lignes de texte avec BufferedReader readLine() et les octets du fichier avec InputStream read(byte[] bytes). Le client envoie d'abord une ligne de texte, puis des données d'un fichier sous forme d'octets et enfin une ligne de texte à nouveau. Le problème est qu'après avoir envoyé et reçu le fichier avec succès par le serveur, il ne reçoit pas la ligne de texte. J'ai vérifié et réalisé que le BufferedReader ne reçoit jamais cette ligne de texte. Comme vous pouvez le voir, j'ai écrit un \n après que les données du fichier ont été écrites, au cas où ce serait le problème, mais cela n'a pas fonctionné. Il me manque probablement quelque chose lié au fonctionnement de ces flux.

Une idée? Merci d'avance.

Répondre

0

Le problème dans ce 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."); 
} 

Vous utilisez try-finally avec OutputStream fos = socket.getOutputStream(), après la sortie de try-finally bloc de code programme, près socket.getOutputStream() parce try-finally toujours faire appel à la méthode close dans implicite finally bloc . Vous utilisez PrintWriter même SocketOutputStream ici:

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

Mais ce courant déjà fermé.

Essayez ceci:

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 

Il va mieux, si vous l'utilisateur qu'un seul: PrintWriter ou OutputStream