0

サーブレット側:

for (GameParticipant activePlayer : connector.activePlayers) {
            activePlayer.out.println(response);
            activePlayer.out.flush();
            System.out.println("Server sending board state to all game participants:" + response);

(activePlayer.outは、そのクライアントが最初に接続したときに取得したHttpResponseオブジェクトからサーバーに保存されたPrintWriterです)

クリネット側:

private void receiveMessageFromServer() {
    try {
        BufferedReader br = new BufferedReader(new InputStreamReader(conn.getInputStream()));
        StringBuilder sb = new StringBuilder();
        String input = null;
        while ((input = br.readLine()) != null){
            sb.append(input).append(" ");
        }
        }

何らかの理由で、この通信は、クライアントが接続を要求し、同じメソッドで応答を待機するときに初めて機能しますが、サーバーは、doPostメソッドで使用可能なHttpRespnseから直接取得したPrintWriterを使用します。その後、サーブレットがPrintWriterを再利用してdoPostメソッドの外部でクリネットと通信しようとしても、何も起こらず、メッセージがクライアントに届くことはありません。何か案は?

PSクライアントコンストラクターの場合:

try {
        url = new URL("http://localhost:8182/stream");
        conn = (HttpURLConnection) url.openConnection();
    } catch (MalformedURLException e) {
        e.printStackTrace();
    } catch (IOException ioE) {
        ioE.printStackTrace();
    }
4

1 に答える 1

1

応答出力ストリームは、doPost() メソッドの外では有効ではありません。より正確には、service() メソッドの外側では有効ではありません。1 つの応答を送信するためにのみ使用できます。ただし、PrintWriter はエラー ステータスを確認するとわかるように、例外を飲み込みます。そのため、問題は見られませんでした。

つまり、サーバー側の設計全体に欠陥があります。そのようにサーブレット仕様を悪用することはできません。

于 2012-08-19T06:11:12.123 に答える