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.
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
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
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