2010-09-29 19 views
0

C'est un client-serveur simple où Server en utilisant un objet BufferedWriter enverrait au client recevant dans l'objet BufferedReader.pourquoi mon client ne lit pas correctement le outputStream envoyé par le serveur?

Lorsque j'utilise OutputStream et PrintWriter pour le serveur et InputStream et Scanner pour le client il fonctionne bien.

Ce qui arrive est que le client dans Buffered façon lit -1 si j'envoie un int et null pour Chaîne.

J'espère que mon anglais a du sens. ; P

C'est le code:

serveur:

import java.io.*; 
import java.net.*; 

public class Server { 

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

     ServerSocket server = new ServerSocket(8189); 
     Socket incoming; 

     incoming = server.accept(); 
     try { 
      // OutputStream output = incoming.getOutputStream(); 
      // PrintWriter outStream = new PrintWriter(output, true /*autoFlush*/); 
      // outStream.println("ENTER"); 
      BufferedWriter output = new BufferedWriter(new   
            OutputStreamWriter(incoming.getOutputStream())); 
      output.write(3); 
      System.out.println("\nSent"); 

     } finally { 
      incoming.close(); 
     } 
    } 
} 

client:

import java.io.*; 
import java.net.*; 
import java.util.Scanner; 

public class Client { 

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

     //Client theClient= new Client(); 
     Socket RTSPSocket; 
     int ServerPort = 8189; 
     //server name address 
     String ServerHost = "localhost"; 

     //get Server IP Address 
     InetAddress ServerIPAddress = InetAddress.getByName(ServerHost); 

     RTSPSocket = new Socket(ServerIPAddress, ServerPort); 

     try { 
      /* 
      InputStream input = theClient.RTSPSocket.getInputStream(); 
      Scanner in = new Scanner(input); 
      String line = in.nextLine(); 
      System.out.println(line); 
      */ 

      BufferedReader input = new BufferedReader(new 
            InputStreamReader(RTSPSocket.getInputStream())); 

      //String line = input.readLine(); 
      //System.out.println("\nRicevuto: " + line); 
      System.out.println(input.read()); 
     } catch (Exception e) { 
      System.err.println("Error: " + e); 
     } 
    } 
} 

Répondre

1

Vous devez vider les données pour les recevoir dans la partie client.

 output.write(3); 
     output.flush(); 
     System.out.println("\nSent"); 

Lorsque vous avez un OutputStream (ou un écrivain), vous devez vider vos données, de cette façon vous êtes 100% sûr que ce que vous vouliez être envoyer a été envoyé.

La plupart (sinon toutes) les sous-classes OutputStream utilisent un "mini-tampon" qui n'est vidé que lorsqu'il est plein ou que vous appelez manuellement flush(). Dans votre cas, c'est encore plus flagrant parce que vous utilisez un BufferedWriter. Une autre chose, lorsque vous utilisez des flux/écrivains, vous devriez vraiment les fermer lorsque vous avez terminé, l'une des choses principales close() (la plupart du temps) est de vider les dernières données restantes dans le "mini-tampon" .


Ressources:

+0

Merci les gars. Maintenant ça marche. Je ne le savais pas! – soneangel

3

essayer de mettre le code suivant après output.write (3);

output.flush(); 

Le BufferedOutputStream est construit pour envoyer uniquement les données lorsque la mémoire tampon est plein (je crois que la valeur par défaut 1024 octets). Ainsi, pour forcer l'envoi des données, vous devez vider le flux.

+1

Eh oui. En outre, vous devrez fermer le BufferedOutputWriter dans votre bloc finally. Cela fermera implicitement le Socket, bien qu'il soit généralement considéré comme une bonne forme pour fermer explicitement les deux. – romacafe

+0

Merci les gars. Maintenant ça marche. Je ne le savais pas! – soneangel