2010-09-26 13 views
0

J'ai seulement commencé à apprendre Java. Ma tâche consiste à créer un serveur de fichiers qui accepte certaines commandes comme File Get, File Put et File Delete à partir de plusieurs clients utilisant Threading. J'utilise un objet DataObject de classe personnalisée pour sérialiser et envoyer des commandes et toutes les données qui peuvent l'accompagner. Le client doit être rendu interactif en ce sens qu'il implique une saisie manuelle des différentes commandes. Cela signifie que la fonction ObjectInputStream readObject() ne fonctionnera pas dans une boucle while (true) à cause d'une exception EOFException. Que puis-je faire pour que le thread du serveur pauses à readObject() jusqu'à ce qu'il voit l'objet suivant, puis reprend la boucle while (true)?Java: Lecture depuis ObjectInputStream

code au serveur (pistes pour chaque fil séparément):

public void run() { 
    ObjectInputStream is = null; 
    ObjectOutputStream os = null; 
    try{ 
     is = new ObjectInputStream(clientSocket.getInputStream()); 
     os = new ObjectOutputStream(clientSocket.getOutputStream()); 
     while (true) { 
      input = (DataObject) is.readObject(); 
      //System.out.println("Input has been read"); 
      output = CommandProcessor.process(input); 
      if(output.data == null) { 
       os.writeObject(output); 
       if(output.message.compareToIgnoreCase("Rsp Bye")==0){ 
        clientSocket.close(); 
       } 
      } 
     } 
    } 

Code à client:

public Talker() { 
      DataObject input = new DataObject(0), output = new DataObject(0); 
      try { 
       log = new PrintStream("/home/meher/log.txt"); 
       InetAddress serverAddress = InetAddress.getByName("127.0.0.1"); 
       Socket serverSocket = new Socket(serverAddress, port); 
       os = new ObjectOutputStream(serverSocket.getOutputStream()); 
       is = new ObjectInputStream(serverSocket.getInputStream()); 
       CommandExecuter.Hello(output); 
       write(output); 
       read(input); 
       while(not-end-of-user-input){ //Yet to code this part 
          //Execute commands 
        } 
      } 
+4

Je dois dire que c'est une tâche assez difficile pour une personne qui n'a commencé l'apprentissage de Java. – Roman

+0

Il s'agit d'une mission prévue demain dans un cours sur les systèmes d'exploitation distribués. Java est la langue attendue. – Anand

+0

S'il vous plaît ne pas que je ne ai pas pris la peine de mettre dans la partie catch des gestionnaires d'exception ici, mais ils sont là dans le code. – Anand

Répondre

3

EOFException est jeté de readObject quand la fin de flux. Dans votre cas, lorsque le client ferme sa connexion. Donc, si le client envoie un objet au serveur et le ferme immédiatement, le serveur lira un objet et obtiendra EOFExcpetion la prochaine fois qu'il essayera de lire un objet, sur la connexion maintenant fermée.

Peut-être ajouter une commande QUIT, dans laquelle ils acceptent tous deux de mettre fin à la connexion?

+0

Mon client ne doit pas quitter sauf s'il existe un message Bye spécifique. Le client continue d'envoyer des requêtes au fur et à mesure que l'utilisateur tape une commande comme File Get et appuie sur la touche Entrée. Je veux que la connexion persiste tout le temps. – Anand

+0

Peut-être pourriez-vous poster du code? –

+0

Vous ne voyez pas ce qui fait que le client reste là? Si elle ignore la partie non encore codée, elle quittera simplement et mettra fin à la connexion. –

0
solution

ajouter un scanner à l'entrée des données ..on du côté objet d'écriture ... cela permet de garder le fil vivant et disponible, il attendra l'entrée .....

Code Serveur

package com.cdac.Network; 

    import java.io.IOException; 
    import java.io.ObjectOutputStream; 
    import java.net.ServerSocket; 
    import java.net.Socket; 
    import java.net.SocketException; 
    import java.util.Scanner; 

    import com.cdac.collection.Customer; 

    public class Server { 


    public static void main(String[] args) throws IOException,SocketException{ 
    ServerSocket ss=new ServerSocket(1888); 
    Customer customer=new Customer(101); 
    Socket s=ss.accept(); 
    System.out.println("connection establishd"); 

    Scanner scanner=new Scanner(System.in); 
    ObjectOutputStream oos=new ObjectOutputStream(s.getOutputStream()); 
    { 
    oos.writeObject(customer); 
scanner.next(); 
    } 

} 

} 

code client

package com.cdac.Network; 

    import java.io.IOException; 
    import java.io.ObjectInputStream; 
    import java.net.Socket; 
    import java.net.SocketException; 
    import java.net.UnknownHostException; 

    import com.cdac.collection.Customer; 

    public class Client { 

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

    Customer customer = new Customer(101, "amit", 500); 

    // String str1,str2; 
    Socket s = new Socket("localhost", 1888); 

    ObjectInputStream ois = new ObjectInputStream(s.getInputStream()); 
    { 
     Object obj = ois.readObject(); 

     Customer c = (Customer) obj; 
     System.out.println(c); 
    } 
} 

}