2009-11-30 19 views
2

J'essaye d'écrire un client et un serveur de temps pour une affectation et j'ai du mal à obtenir que le serveur reçoive la deuxième requête du client. La première demande se passe bien sans accroc. alors ça s'arrête. Je suis en fait assez perdu dans cette affaire et plutôt mal à l'aise avec Java, donc je n'ai aucune idée de ce qui me manque. Tous les pointeurs sont grandement appréciés. Merci!Java serveur-client | le serveur ne recevra pas la deuxième requête

Voici le code sever:

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

public class myServer { 

     protected static final int PORT_NUMBER = 55555; 

     public static void main(String args[]) { 

     try { 

      ServerSocket servsock = new ServerSocket(PORT_NUMBER); 

      System.out.println("Server running..."); 

      while(true) { 

       Socket sock = servsock.accept(); 

       System.out.println("Connection from: " + sock.getInetAddress()); 

       Scanner in = new Scanner(sock.getInputStream()); 
       PrintWriter out = new PrintWriter(sock.getOutputStream()); 
       String request = ""; 

       request = in.next(); 

       System.out.println("Request: " + request); 

       if(request.toUpperCase().equals("TIME")) { 
        out.println(getTime()); 
        out.flush(); 
       } else { 
        out.println("Invalid Request..."); 
        out.flush(); 
       } 

      } 

     } catch(Exception e) { 
      System.out.println(e.toString()); 
     } 

    } 

     protected static String getTime() { 
      DateFormat dateFormat = new SimpleDateFormat("HH:mm:ss"); 
      Date date = new Date(); 
      return (dateFormat.format(date)); 
     } 

} 

Voici le client:

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

public class myClient { 

     protected static final String HOST = "127.0.0.1"; 
     protected static final int PORT = 55555; 

     protected static Socket sock; 

     public static void main(String args[]) { 

     try { 

       sock = new Socket(HOST,PORT); 

       System.out.println("Connected to " + HOST + " on port " + PORT); 

       Scanner response = new Scanner(sock.getInputStream()); 
       PrintWriter request = new PrintWriter(sock.getOutputStream()); 
       BufferedReader in = new BufferedReader(new InputStreamReader(System.in)); 
       String txt = ""; 

       while(!txt.toUpperCase().equals("EXIT")) { 

        System.out.print("prompt:"); 
        txt = in.readLine(); 

        request.println(txt); 
        request.flush(); 

        System.out.println(response.next()); 

       } 

       request.close(); 
       response.close(); 
       in.close(); 
       sock.close(); 

      } catch(IOException e) { 
       System.out.println(e.toString()); 
      } 
     } 

} 

Répondre

4

Vous devez avoir une autre boucle while, quelque chose comme ça,

while(true) {     
     Socket sock = servsock.accept();     
     System.out.println("Connection from: " + sock.getInetAddress());     
     Scanner in = new Scanner(sock.getInputStream());     
     PrintWriter out = new PrintWriter(sock.getOutputStream());     
     String request = "";     
     while (in.hasNext()) { 
      request = in.next();     
      System.out.println("Request: " + request);     
      if(request.toUpperCase().equals("TIME")) {      
       out.println(getTime()); 
       out.flush();     
      } else { 
       out.println("Invalid Request...");      
       out.flush(); 
      } 
     } 
} 
+1

Merci beaucoup! Cela fait si longtemps que je suis en train de le faire. Je ne sais pas pourquoi je ne l'ai pas vu, mais MERCI! – seventeen

+0

Merci de sauver ma journée :) – koutuk

2

De l'PrintWriterdocs:

... si rinçage automatique est activée, il sera fait seulement lorsque l'un des println, printf ou format méthodes sont invoquées ...

Votre serveur appelle le print() et ne vide jamais le flux, donc l'heure n'est jamais envoyée. Appelez println() ou videz explicitement le flux.

En outre, le serveur ferme la connexion immédiatement après l'envoi du temps, de sorte que la deuxième demande du client échoue toujours ...

Edit: il y a une bizarrerie intéressante - la fermeture de la PrintWriterdoit pour rincer (voir la spécification de Writer), mais en raison de l'ordre des opérations que semble à la place Happen est:

  1. in.close() ferme le sous-jacent Socket
  2. out.close()serait débusquer les données écrites, mais ne peut pas (comme la prise est maintenant fermée)

Je ne sais pas c'est exactement ce qui se passe, mais la permutation de l'ordre de ces deux déclarations modifie le comportement , ce qui donne sans doute out.close() une chance de débusquer ...

+0

merci, j'ai cha nged quelques choses et j'ai finalement eu les deux pour communiquer. Cependant, il n'accepte toujours pas une deuxième demande. Je mets à jour le code dans la question à la version actuelle. Des idées? – seventeen

+0

Après avoir lu la première requête, le serveur jette simplement la connexion et appelle à nouveau servsock.accept() ', ce qui l'oblige à attendre qu'un nouveau client se connecte. – SimonJ