2016-04-24 8 views
0

私は、クライアントとサーバー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; 
} 

}

私は失われていて私を助けてください。

答えて

0

2つの応答しか期待していないときにループを使用しています。それは意味をなさない。 readObject()に2回だけ電話してください。

NBあなたのループはとにかく正しくありません。 readObject()は、ストリームの最後にnullを返しません。それはEOFExceptionを投げます。したがって、ループ終了条件としてnullを使用するのは間違いです。 nullを書き込むたびにnullを返すことができます。

利用可能なデータがない場合もnullを返しません。それはブロックする。

+0

無限ループに詰まっているわけではありません。 in.readobjectはブロックされたメソッドです...私はsystem.out.printlnを入れて、それが存在するかどうかを確認し、ダミーのプリントを常に印刷していませんでした。 – DJavaMan

+0

あなたは誤解しています。私はあなたのループが間違って書かれていると言って、あなたが2つのオブジェクトだけを期待しているときにループするのは理にかなっていません。 3回目の読み取りはブロックされ、データは使用できず、接続は開いたままです。それがあなたが望むものでないなら、3度目の読書をしないでください。 – EJP

+0

私はそれがちょうど1つの場合であることを見ています。私が受け取っている物体の数がわからないとしたら、どうすればいいですか?私がreadObjectをもう一度呼び出すと(ブロックされてからEOFを投げることはありません) – DJavaMan

関連する問題