私は、クライアントとサーバーJava OISがreadObjectでスタックされています..どのようにブロックを解除するのですか?
サーバーを持っている - 一度納入それらを印刷し、その後のリクエストクッキー - クッキー
クライアント(複数可)を提供します。
出力ストリームが書き込まれてフラッシュされるまでOISがブロックされていることがわかりますが、その意味はわかりません。私は、要求を書いた後にflush()を呼び出そうとしましたが、うまくいきませんでした。
2回目にOIS#readObjectが呼び出された後に固まってしまいます。
は、ここに私のコードです:
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;
}
}
私は失われていて私を助けてください。
無限ループに詰まっているわけではありません。 in.readobjectはブロックされたメソッドです...私はsystem.out.printlnを入れて、それが存在するかどうかを確認し、ダミーのプリントを常に印刷していませんでした。 – DJavaMan
あなたは誤解しています。私はあなたのループが間違って書かれていると言って、あなたが2つのオブジェクトだけを期待しているときにループするのは理にかなっていません。 3回目の読み取りはブロックされ、データは使用できず、接続は開いたままです。それがあなたが望むものでないなら、3度目の読書をしないでください。 – EJP
私はそれがちょうど1つの場合であることを見ています。私が受け取っている物体の数がわからないとしたら、どうすればいいですか?私がreadObjectをもう一度呼び出すと(ブロックされてからEOFを投げることはありません) – DJavaMan