在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)
在clinet方面:
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通信时,没有任何反应,消息永远不会到达客户端。有什么想法吗?
P.S。在客户端构造函数中:
try {
url = new URL("http://localhost:8182/stream");
conn = (HttpURLConnection) url.openConnection();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException ioE) {
ioE.printStackTrace();
}
答案 0 :(得分:1)
响应输出流在doPost()方法之外无效,或者更恰当地说是service()方法。它只能用于发送一个响应。但是,PrintWriter会吞下异常,因为当您检查其错误状态时会发现异常,因此您没有看到问题。
换句话说,整个服务器端设计存在缺陷。你不能以这种方式滥用Servlet规范。