0

在 Servlet 方面:

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。之后,当 servlet 尝试重用 PrintWriter 与 doPost 方法之外的 clinet 对话时,什么也没有发生,消息永远不会到达客户端。有任何想法吗?

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() 方法。它只能用于发送一个响应。但是 PrintWriter 会吞下异常,正如您在检查其错误状态时会发现的那样,因此您没有看到问题。

换句话说,您的整个服务器端设计是有缺陷的。您不能以这种方式滥用 Servlet 规范。

于 2012-08-19T06:11:12.123 回答