2015-12-01 1 views
1

Mon code suffit d'une tâche simple envoyer un texte de la console du client au serveur et recevoir une réponse. Mais mon code ne fonctionne pas bien. Je continue d'envoyer du texte au serveur et aucune réponse ne renvoie. J'ai fait un exemple plusieurs que plus 2 nombre donné du client. Je fais cela de la même manière mais je n'arrive pas à comprendre quel est le problème.Comment puis-je obtenir la réponse du serveur TCP en Java

Serveur:

public class Server { 
    public static void main(String[] args) { 
     try { 
      ServerSocket server = new ServerSocket(8); 
      Socket client = server.accept(); 
      BufferedReader inFromClient = new BufferedReader(new InputStreamReader(client.getInputStream())); 
      BufferedWriter outToClient = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 
      String in = inFromClient.readLine(),out; 
      while(in!=null){ 
       out = in+" from server"; 
       outToClient.write(out); 
       outToClient.newLine(); 
       outToClient.flush(); 
      } 
      inFromClient.close(); 
      outToClient.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 

Client:

public class Client { 
    public static void main(String[] args) { 
     try { 
      Socket client = new Socket("localhost", 8); 
      System.out.println("Connected to server"); 
      BufferedReader inFromServer = new BufferedReader(new InputStreamReader(client.getInputStream())); 
      BufferedWriter outToServer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 
      Scanner input = new Scanner(System.in); 
      String strClient,strServer; 
      while(true){ 
       System.out.print("Client: "); 
       strClient = input.nextLine(); 
       outToServer.write(strClient); 
       strServer = inFromServer.readLine(); 
       System.out.print("Server: "); 
       System.out.println(strServer); 
      } 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 

    } 
} 

Répondre

2

Il y a plusieurs problèmes avec votre code:

  1. Votre serveur attend de lire une ligne et que vous n'écrire Texte sans symbole de nouvelle ligne:

lecture d'une ligne dans le serveur avec: inFromClient.readLine()

Écrire un texte sans retour à la ligne dans le client: outToServer.write(strClient); Remplacez cette outToServer.write(strClient + "\n");


  1. Vous ne vident pas la écrivain du client. Ajouter un outToServer.flush(); après la ligne outToServer.write(...);

  1. Vous ne lisez 1 ligne sur le serveur et ne pas lire dans la boucle.

EDIT: Pour faciliter je posterai le code corrigé ici: (Je l'ai essayé et cela fonctionne comme un charme)

Client:

public class Client { 
    public static void main(String[] args) { 
     try (Socket client = new Socket("localhost", 8); 
      BufferedReader inFromServer = new BufferedReader(new InputStreamReader(client.getInputStream())); 
      BufferedWriter outToServer = new BufferedWriter(new OutputStreamWriter(client.getOutputStream())); 
      Scanner input = new Scanner(System.in)) { 

      System.out.println("Connected to server"); 
      String strClient,strServer; 

      while(true){ 
       System.out.print("Client: "); 
       strClient = input.nextLine(); 
       outToServer.write(strClient); 
       outToServer.newLine(); 
       outToServer.flush(); 
       strServer = inFromServer.readLine(); 
       System.out.println("Server: " + strServer); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

serveur:

public class Server { 
    public static void main(String[] args) { 
     try (ServerSocket server = new ServerSocket(8); 
      Socket client = server.accept(); 
      BufferedReader inFromClient = new BufferedReader(new InputStreamReader(client.getInputStream())); 
      BufferedWriter outToClient = new BufferedWriter(new OutputStreamWriter(client.getOutputStream()))) { 

      String in = inFromClient.readLine(), out; 
      while(in != null){ 
       out = in + " from server"; 
       outToClient.write(out); 
       outToClient.newLine(); 
       outToClient.flush(); 
       in = inFromClient.readLine(); 
      } 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Ple ase remarque que cette solution utilise Javas ARM (Automatic resource management) pour l'autoclosion des flux et des sockets. Donc, cela ne fonctionnera pas avant java 1.7!

+0

Cela ne fonctionne pas. En console, j'écris encore beaucoup de texte sans aucune réponse. –

+0

Avez-vous ajouté la nouvelle ligne et la couleur? – ParkerHalo

+0

oui. J'ai ajouté newline et vider et réparer la boucle. –