2010-06-09 5 views
1

Les gars pourraient-ils me dire ce qui ne va pas, je fais ici? Voici quatre fichiers Client, principal, Serveur, principal. Je reçois une erreur côté client après avoir essayé fromServer.readLine().
Erreur: Erreur dans le logiciel client causé annulation de la connexion: recv n'aApplication client/serveur

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

      public class Client 
      { 
      private PrintWriter toServer; 
      private BufferedReader fromServer; 
      private Socket socket; 
      public Client()throws IOException 
       { 
       socket = new Socket("127.0.0.1",3000); 
      } 
      public void openStreams() throws IOException 
       { 

      // 
      //  InputStream is = socket.getInputStream(); 
      //  OutputStream os = socket.getOutputStream(); 
      //  fromServer = new BufferedReader(new InputStreamReader(is)); 
      //  toServer = new PrintWriter(os, true); 

       toServer = new PrintWriter(socket.getOutputStream(),true); 
       fromServer = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
      } 
      public void closeStreams() throws IOException 
       { 
       fromServer.close(); 
       toServer.close(); 
       socket.close(); 
      } 
      public void run()throws IOException 
       { 
       openStreams(); 
       String msg = ""; 
       Scanner scanner = new Scanner(System.in); 
       toServer.println("Hello from Client."); 
      // msg = scanner.nextLine(); 
       while (msg != "exit") 
       { 
        System.out.println(">"); 
      //  msg = scanner.nextLine(); 
        toServer.println("msg"); 
        String tmp = fromServer.readLine(); 
        System.out.println("Server said: " + tmp); 
       } 
       closeStreams(); 
      } 
      } 



     package server; 
     import java.net.*; 
     import java.io.*; 

     public class Server 
     { 
     private ServerSocket serverSocket; 
     private Socket socket; 
     private PrintWriter toClient; 
     private BufferedReader fromClient; 
     public void run() throws IOException 
      { 
      System.out.println("Server is waiting for connections..."); 
      while (true) 
      { 
       openStreams(); 
       processClient(); 
       closeStreams(); 
      } 

     } 
     public void openStreams() throws IOException 
      { 
      serverSocket = new ServerSocket(3000); 
      socket = serverSocket.accept(); 
      toClient = new PrintWriter(socket.getOutputStream(),true); 
      fromClient = new BufferedReader(new InputStreamReader(socket.getInputStream())); 
     } 
     public void closeStreams() throws IOException 
      { 
      fromClient.close(); 
      toClient.close(); 
      socket.close(); 
      serverSocket.close(); 
     } 
     public void processClient()throws IOException 
      { 
      System.out.println("Connection established."); 
      String msg = fromClient.readLine(); 
      toClient.println("Client said " + msg); 
     } 
     } 


    package client; 

    import java.io.IOException; 


    public class Main { 

     /** 
     * @param args the command line arguments 
     */ 
     public static void main(String[] args) { 
      // TODO code application logic here 

      try 
      { 
       Client client = new Client(); 
       client.run(); 
      } 
      catch(IOException e) 
      { 
       System.err.println("Error in Client " + e.getMessage()); 
      } 
     } 

    } 



package server; 

import java.io.IOException; 


public class Main { 

    /** 
    * @param args the command line arguments 
    */ 
    public static void main(String[] args) { 
     // TODO code application logic here 
     Server server = new Server(); 
     try 
     { 
     server.run(); 
     } 
     catch(IOException e) 
     { 
      System.err.println("Error in Server " + e.getMessage()); 
     } 
    } 

} 
+3

Allez-vous nous dire quelle est l'erreur, ou devinez-vous? – skaffman

+0

@skaffman Je suis désolé d'avoir oublié ça. J'ai mis à jour mon message original . –

+0

@EJP et Miklos Merci les gars pour vos réponses. –

Répondre

2

Votre côté serveur sont brouillées. Vous avez besoin d'une autre classe, appelez-la Connection ou ConnectedClient, qui implémente Runnable; prend un Socket comme paramètre constructeur; et fait toutes les E/S côté serveur pour un client particulier. À l'heure actuelle vous avez tout cela mélangé avec votre classe de serveur. Tout ce que votre classe Server doit faire est de créer un ServerSocket, et entrez une boucle acceptant Sockets et créant des objets Connection et des threads de départ pour eux. L'objet Socket de la méthode run() du serveur est simplement un objet local et les flux d'entrée/sortie ou lecteurs/graveurs associés appartiennent à la classe Connection, pas à la classe Server.

De cette façon, vous pouvez gérer plusieurs clients simultanément sans qu'ils marchent sur les pieds de l'autre.

Votre prochain problème est que readLine() renvoie null lorsque l'autre extrémité a fermé la connexion. Vous devez tester ce en premier avant d'effectuer un autre traitement chaque fois que vous appelez readLine().

Ensuite, chaque fois que vous obtenez une exception SocketException ou IOException autre que SocketTimeoutException lors de l'utilisation d'un socket, il est mort - fermez-le, oubliez ce client et quittez le thread s'il se produit sur le serveur.

2

Le code affiché est en cours d'exécution dans une boucle infinie du côté client. Après deviner quelle ligne décommenter (dernière scanner.nextLine() à Client.java), je l'ai remarqué les problèmes suivants:

  1. le client maintient la connexion ouverte, mais le serveur ferme après avoir reçu le premier message.
  2. le prédicat msg != "exit" est toujours vrai en Java - utiliser String.equals()

Un Server.processClient travail est:

public void processClient()throws IOException 
{ 
    String msg = null; 
    do { 
     msg = fromClient.readLine(); 
     toClient.println("Client said " + msg); 
    } while (!"exit".equals(msg)); 
} 

Un travail Client.run est:

public void run()throws IOException 
{ 
    openStreams(); 
    String msg = ""; 
    Scanner scanner = new Scanner(System.in); 
    while (!"exit".equals(msg)) 
    { 
     System.out.print(">"); 
     msg = scanner.nextLine(); 
     toServer.println(msg); 
     String tmp = fromServer.readLine(); 
     System.out.println("Server said: " + tmp); 
    } 
    closeStreams(); 
} 

+ Commentaire: Je me suis concentré sur la correction des erreurs évidentes. La réponse d'EJP vous donne de bonnes directives pour améliorer votre code, y compris la gestion des connexions simultanées, l'utilisation correcte des threads, etc.