2016-11-09 2 views
-1

J'essaye de faire un petit exemple avec les sockets java. Mais je ne peux pas le faire fonctionner. Le serveur reçoit correctement la requête du client. Mais le problème vient, quand j'essaie d'envoyer au serveur la chaîne "bonjour".Connexion entre le serveur socket java et le client socket

Comme j'ai débogué, l'InputStream dans le serveur est null, donc il n'imprime rien. Je pense que le problème doit être dans le PrinterWriter, je devrais peut-être utiliser une autre classe, je l'ai essayé avec d'autres classes comme BufferedWriter, mais je ne pouvais pas le faire fonctionner

ici est mon code

serveur

public class ServidorFechaHora { 

    static final int port = 5000; 
    static String line; 

    public static void main(String[] args) throws IOException { 
     // TODO Auto-generated method stub 
     ServerSocket ss = new ServerSocket(port); 
     while (true) { 
      /* accept nos devuelve el Socket conectado a un nuevo cliente. 
      Si no hay un nuevo cliente, se bloquea hasta que haya un 
      nuevo cliente. 
      */ 
      Socket soc = ss.accept(); 
      System.out.println("Cliente conectado"); 
      // Obtenemos el flujo de entrada del socket 
      InputStream is = (InputStream) soc.getInputStream(); 
      //Función que llevaría a cabo el envío y recepción de los datos. 
      processClient(is); 
     } 
    } 

    private static void processClient(InputStream is) throws IOException { 
     // TODO Auto-generated method stub 
     BufferedReader bis = new BufferedReader(new InputStreamReader(is)); 

     while ((line = bis.readLine()) != null){ 
      System.out.println(line); 
     } 

     bis.close(); 
    } 

} 

client

public class ClienteFechaHora { 
    public static void main(String[] args) throws IOException, InterruptedException { 
     Socket client = null; 
     PrintWriter output = null; 
     //BufferedOutputStream out = null; 
     DateFormat hourdateFormat = new SimpleDateFormat("dd/MM/yyyy HH:mm:ss"); 

     try { 
       client = new Socket("127.0.0.1", port); 
       output = new PrintWriter(client.getOutputStream(), false); 

       while (true) { 
        System.out.println("Enviando datos..."); 
        output.write("hello"); 
        output.flush(); 
        Thread.currentThread().sleep(2000); 
        //System.out.println("Fecha y hora: " + hourdateFormat); 
       } 
     } 
     catch (IOException e) { 
      System.out.println(e); 
     } 
     output.close(); 
     client.close(); 
    } 
} 

Merci à l'avance!

+0

Je viens de vérifier le serveur avec mon client fictif et fonctionne bien –

+0

Le flux d'entrée dans le serveur n'est jamais nul. Pas clair ce que vous demandez. – EJP

+0

EJP comme je l'ai dit j'essaie d'envoyer la chaîne "Bonjour" du client au serveur et l'afficher dans la méthode de serveur appelée "processClient". Je pense que c'est clair ce que j'essaie de faire juste lire la description ou le code. S'il vous plaît, lisez plus attentivement la prochaine fois au lieu de me donner des points négatifs. :) – Javi

Répondre

1

Votre serveur est en train de lire la ligne par ligne prise:

BufferedReader bis = new BufferedReader(new InputStreamReader(is)); 

while ((line = bis.readLine()) != null){ 
    System.out.println(line); 
} 

BufferedReader.readLine() est documentée comme suit:

Reads une ligne de texte. Une ligne est considérée comme terminée par un saut de ligne ('\ n'), un retour chariot ('\ r') ou un retour chariot suivi immédiatement d'un saut de ligne.

Donc, il ne retourne pas jusqu'à ce qu'il lise un terminateur de ligne.

Votre client d'autre part est en train d'écrire la chaîne « Bonjour » sans terminaison de ligne:

output.write("hello"); 
output.flush(); 

Si vous voulez lire une ligne de texte dans le serveur, vous devez envoyer une ligne de texte (y compris une terminaison de ligne) dans le client:

output.write("hello\n"); 
output.flush(); 
-1

Votre problème semble être que le PrintWriter est un « caractère orienté » flux, qui étend la classe Writer. Et sur le serveur que vous essayez de récupérer les données avec un InputStream, qui est « octet orienté » et étend InputStream

Essayez de changer le client à

in = new BufferedReader (new InputStreamReader (sock. getInputStream());