2016-04-24 3 views
0

Ich habe einen Client und ServerJava OIS fest auf readObject .. wie zu entsperren?

Server - liefert Cookies

Client (s) - Anfragen Cookies dann druckt sie einmal geliefert.

Ich weiß, OIS ist blockiert, bis Ausgangsstrom geschrieben und gelöscht wird, aber ich bin mir nicht sicher, was das bedeutet? Ich habe versucht, flush() nach dem Schreiben der Anfrage, aber das hat nicht funktioniert.

Es bleibt nach dem zweiten Mal stecken OIS # readObject wird aufgerufen.

Hier ist mein Code:

public class CookieServer { 

public static void main(String[] args) { 
    ServerSocket serverSocket = null; 
    try { 
     serverSocket = new ServerSocket(4444); 
    } catch(IOException e) { 

    } 

    while(true) { 
     try(
       Socket clientSocket = serverSocket.accept(); 
       ObjectOutputStream out = new ObjectOutputStream(clientSocket.getOutputStream()); 
       ObjectInputStream in = new ObjectInputStream(clientSocket.getInputStream()); 
     ) { 
      Object inObject; 
      while((inObject = in.readObject()) != null) { 
       if(inObject instanceof String) { 
        if (((String) inObject).equalsIgnoreCase("Give Me Two Random Cookies")) { 
         out.writeObject(new Cookie("Chocalate Chip")); 
         out.flush(); 
         out.writeObject(new Cookie("blueberry Chip")); 
         out.flush(); 
        } 
       } 
      } 
     } catch(Exception e) { 

     } 
     sleep(1000); 
    } 
} 


private static void sleep(long amount) { 
    try { 
     Thread.sleep(amount); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

}

public class CookeClient { 

public static void main(String[] args) { 

    while(true) { 

     try (Socket echoSocket = new Socket("localhost", 4444); 
      ObjectOutputStream out = new ObjectOutputStream(echoSocket.getOutputStream()); 
      ObjectInputStream in = new ObjectInputStream(echoSocket.getInputStream())) { 

      out.writeObject("Give Me Two Random Cookies"); 

      Object inObject; 
      while((inObject = in.readObject()) != null) { // gets stuck here... 
       if(inObject instanceof Cookie) { 
        System.out.println("Received a: " + ((Cookie) inObject).getName() + "cookie"); 
       } 
      } 
     } catch (Exception e) { 

     } 

     sleep(100); 
    } 
} 


private static void sleep(long amount) { 
    try { 
     Thread.sleep(amount); 
    } catch (InterruptedException e) { 
     e.printStackTrace(); 
    } 
} 

}

public class Cookie implements Serializable{ 

private String name; 
public Cookie(String name) { 
    this.name = name; 
} 

public String getName() { 
    return name; 
} 

}

Bitte helfen Sie mir, wie ich bin verloren.

Antwort

0

Sie verwenden eine Schleife, wenn Sie nur zwei Antworten erwarten. Das ergibt keinen Sinn. Rufen Sie einfach zweimal an.

Hinweis Ihre Schleifen sind in jedem Fall falsch. readObject() gibt am Ende des Streams keine Null zurück. Es wirft EOFException. Es ist daher falsch, null als Schleifenbeendigungsbedingung zu verwenden. Es kann jedes Mal null zurückgeben, wenn Sie eine Null geschrieben haben.

Es gibt auch keine Null zurück, wenn keine Daten verfügbar sind. Es blockiert.

+0

es ist nicht in einer Endlosschleife stecken. in.readobject ist eine blockierte Methode ... Ich habe eine system.out.println eingefügt, um zu sehen, ob es war, und es hat den Dummy-Ausdruck nicht konstant gedruckt. – DJavaMan

+0

Sie haben missverstanden. Ich sagte, dass Ihre Schleife falsch geschrieben wurde, und diese Schleife, wenn Sie nur zwei Objekte erwarten, macht keinen Sinn. Der dritte Lesevorgang wird blockiert, solange keine Daten verfügbar sind und die Verbindung offen bleibt. Wenn dies nicht das ist, was Sie wollen, geben Sie keinen dritten Lesevorgang aus. – EJP

+0

Ich sehe, das war nur ein Fall. Sagen wir, ich weiß nicht, wie viele Objekte ich erhalte, was soll ich tun? Wenn ich readObject erneut aufruft (wird EOF nicht werfen, da es blockiert wird) – DJavaMan