在 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/