【问题标题】:Java - communication between servlet and clientJava - servlet 和客户端之间的通信
【发布时间】:2012-08-18 23:49:21
【问题描述】:

在 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 对话时,什么也没有发生,消息永远不会到达客户端。有什么想法吗?

附:在客户端构造函数中:

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

【问题讨论】:

  • 发布整个代码而不是随机的部分会使事情更清楚。另外,“当客户端请求连接并以相同的方法等待响应时”,您是指同一个客户端,还是第二个新客户端?
  • 同一个客户端,以同样的方法发出连接请求,它也在等待响应。我认为问题与重用 URL 和连接有关

标签: java servlets client client-server


【解决方案1】:

响应输出流在 doPost() 方法之外无效,或者更准确地说是 service() 方法。它只能用于发送一个响应。但是 PrintWriter 会吞下异常,当您检查其错误状态时会发现,因此您没有看到问题。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-09
    • 2015-06-10
    • 2015-02-16
    相关资源
    最近更新 更多