Java-servlet和客户端之间的通信

标签 java servlets client client-server

在 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();
    }

最佳答案

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

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

关于Java-servlet和客户端之间的通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12023127/

相关文章:

java - Jtable 行删除

java - Tomcat 不显示带有集群和 apache 的页面

c++ - Qt 中的非阻塞线程 tcpi 客户端

java - Android 和 java 蓝牙客户端服务器应用程序

go - 每次请求后关闭 http2 客户端连接

java - 使用 GhostDriver 时如何设置屏幕/窗口大小

java - 在 Java 中删除大括号

java - 验证针对凭据的 SAML 断言 - opensaml 3

java - 从 Applet 向 servlet 发送数据时出现 EOFException

java - 在正在运行的 java 程序的后台执行 jsp 程序